今天详细看了一下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;
}