BFS

今天详细看了一下BFS
算法和之前学习的……emmmmmm可能开始不够吧
先看一下蓝桥杯一道全球变暖的题……恨不得练10000道让我信手捏来一个dfs
第一遍一直提醒自己递归,然而……
思路就是最开始统计一下多少个岛屿
然后淹没之后统计岛屿相减
然而第一遍每次都是从头到尾遍历,相当于树的层序遍历吧,复杂度极高,运行时间也很长

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
int n;
char MAP[1005][1005];

struct plain{
    bool tag;
    bool drown;
    int k;
};
plain MAP2[1005][1005];

int dir[4][2]={-1,0,1,0,0,-1,0,1};
int K=1;
void visit(char MAP[1005][1005],int x,int y){

    bool flag=false;
    if(MAP[x][y]=='#'){ 
    for(int i=0;i<4;i++){
            int X=x+dir[i][0];
            int Y=y+dir[i][1];//重新定义避免影响其他方向 
            
            if(MAP[X][Y]=='.') 
            {
            MAP2[x][y].drown=true;  
            }
            if(MAP[X][Y]=='#')
            {
                if(MAP2[X][Y].tag==false)flag=true;
                MAP2[X][Y].k=K;
            }
            MAP2[x][y].tag=true;
        }
        if(flag==false)K++;
        cout<<K<<"#"<<endl;
    }
} 



int main()
{
  scanf("%d",&n);
  for(int i=0;i<n;i++){
    scanf("%s",MAP[i]);
    for(int j=0;j<n;j++){
        if(MAP[i][j]=='#')
        {
            plain p;
            p.drown=p.tag=false;
            p.k=0;
            MAP2[i][j]=p;
        }
    }
}
for(int i=1;i<n-1;i++){
    for(int j=1;j<n-1;j++){
        visit(MAP,i,j);
    }
}
   for(int i=0;i<n;i++){
     for(int j=0;j<n;j++){
    printf("%d ",MAP2[i][j].k);
  }
  cout<<endl;
}
int drown_il=0;

for(int K2=1;K2<K;){
for(int i=1;i<n;i++){
     for(int j=1;j<n;j++){
        if(MAP[i][j]=='#')
        {
        if(MAP2[i][j].k==K2&&MAP2[i][j].drown==false)drown_il+=1;
        if(MAP2[i][j].k!=K2)K2++;
        }
     }
     
   }
}
cout<<drown_il<<endl;
  return 0;
}

第二遍倒是用了递归dfs……然鹅,按照我之前的思路统计岛屿个数,就是如果一片土地周围除了海被访问过的岛,他就是这片岛的最后一个……就是这个zz算法完全会把一个岛切成2个啊
受不了自己的智商……就这样吧 打印准考证去了……

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
int n;
char MAP[1005][1005];
char MAP2[1005][1005];
int dir[4][2]={-1,0,1,0,0,-1,0,1};
int K=1;

void drown(int x,int y){
    for(int i=0;i<4;i++){
            cout<<"###"<<x<<y<<endl;
            int X=x+dir[i][0];
            int Y=y+dir[i][1];//重新定义避免影响其他方向 
            if(MAP2[X][Y]=='.'){
                cout<<"###"<<x<<y<<endl;
            MAP2[x][y]='^';
            }
        }
}
bool is_ilse(int x,int y){
    bool flag=true;
    for(int i=0;i<4;i++){
            int X=x+dir[i][0];
            int Y=y+dir[i][1];//重新定义避免影响其他方向 
            if(MAP2[X][Y]=='#')flag=false;
        }
        cout<<x<<" "<<y<<" falg"<<flag<<endl;
        if(flag==true)return 1;
        if(flag==false)return 0;
}

void dfs(int x,int y,int &count_p){
    if(is_ilse(x,y))
    {
        MAP2[x][y]='@';
    count_p++;
    return;
    }
    MAP2[x][y]=-1;
        for(int i=0;i<4;i++){
            int X=x+dir[i][0];
            int Y=y+dir[i][1];
            if(MAP2[X][Y] == '#'){
                dfs(X,Y,count_p);
            }
    }
} 

int main()
{
  scanf("%d",&n);
  for(int i=0;i<n;i++){
    scanf("%s",MAP[i]);
    }
for(int i=0;i<n;i++){
     for(int j=0;j<n;j++){
     MAP2[i][j]=MAP[i][j];
    }
}
int begin=0;
int end=0;

for(int i=1;i<n;i++){
     for(int j=1;j<n;j++){
        if(MAP2[i][j]=='#')
        dfs(i,j,begin);
    }
}
for(int i=0;i<n;i++){
     for(int j=0;j<n;j++){
        if(MAP[i][j]=='#')
        drown(i,j);
    }
}
   for(int i=0;i<n;i++){
     for(int j=0;j<n;j++){
    printf("%d ",MAP2[i][j]);
  }
  cout<<endl;
}
cout<<endl;
for(int i=0;i<n;i++){
     for(int j=0;j<n;j++){
        if(MAP[i][j]=='@')
        dfs(i,j,end);
    }
}
   for(int i=0;i<n;i++){
     for(int j=0;j<n;j++){
    printf("%d ",MAP2[i][j]);
  }
  cout<<endl;
}
cout<<begin<<" "<<end<<endl;

  return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容