蓝桥杯全球变暖简单写法详细易懂

    科技2022-09-06  121

    @蓝桥杯 全球变暖 简单写法 超详细

    题目链接:全球变暖

    思路:

    **这道的大致写法就是用dfs将各个岛屿先编号(vis值)作为t, 编完号之后将上下左右有' . '这个字符的' # '的vis值改为0, 之后遍历整个字符数组,查找还剩几个vis数不为0,作为 h(当然不能重复计算) 再用t-h+1(为什么要加1?因为有些vis值一开始就是0) 那么下面就是具体代码,具体请看注释** #include<bits/stdc++.h> using namespace std; const int N=1e3+5; int n,t,h,res[N],vis[N][N];/*t记录一开始有多少块岛屿,h记录之后的, res数组是帮助记录h的,vis记录t*/ char a[N][N]; int dx[4]={0,1,0,-1};//上下左右 int dy[4]={1,0,-1,0}; bool Check(int x,int y){//判断有无出界 if(x>n||x<=0||y>n||y<=0) return false; return true; } void dfs(int x,int y,int t){//主要dfs代码 if(a[x][y]!='#'||vis[x][y]!=0)//如果不是陆地或者已经遍历过就返回 return ; if(!Check(x,y))//如果出界就返回 return ; vis[x][y]=t;//将这个陆地的vis赋值 for(int i=0;i<=3;i++)//上下左右遍历 dfs(x+dx[i],y+dy[i],t);//继续找 } int main(){ cin>>n; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>a[i][j]; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(a[i][j]=='#'&&!vis[i][j])//如果为陆地且没有遍历过 dfs(i,j,++t);//发现新大陆,就是t就++(比如上一块大陆为2,这里就是3) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(a[i][j]=='#'){ for(int k=0;k<=3;k++)//这里无需判断是否出界,题目说了1和n的行,列必为' . ' if(a[i+dx[k]][j+dy[k]]=='.'){//如果找到这个陆地旁边是海 vis[i][j]=0;//将他的vis值改为0 break; } } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(a[i][j]=='#') if(!res[vis[i][j]]){//如果这块大陆还没消失,就h++ h++; res[vis[i][j]]=1;//假设让他“消失”,不然会重复 } cout<<t-h+1; return 0; }
    Processed: 0.008, SQL: 9