考察:Flood Fill(dfs or bfs)
错误思路:
根据每个数字建立一张char类型的新图.
这种做法超麻烦!!!注意这道题1 2 4 8的数字不是偶然的,这正好对应每位二进制的1.
这道题用如果用方向数组要根据下标来判断该位是否为1才能继续前进.
1 #include <iostream> 2 #include <cstring> 3 const int N = 55; 4 int mp[N][N],n,m,ans,maxn,area; 5 bool st[N][N]; 6 int maxx(int a,int b) 7 { 8 return a>b?a:b; 9 } 10 void dfs(int x,int y) 11 { 12 if(x<1||x>n||y<1||y>m||st[x][y]) return; 13 st[x][y] = 1; 14 area++; 15 if(!(mp[x][y]&1)) dfs(x,y-1); 16 if(!(mp[x][y]>>1&1)) dfs(x-1,y); 17 if(!(mp[x][y]>>2&1)) dfs(x,y+1); 18 if(!(mp[x][y]>>3&1)) dfs(x+1,y); 19 } 20 int main() 21 { 22 scanf("%d%d",&n,&m); 23 for(int i=1;i<=n;i++) 24 for(int j=1;j<=m;j++) scanf("%d",&mp[i][j]); 25 for(int i=1;i<=n;i++) 26 for(int j=1;j<=m;j++) 27 if(!st[i][j]) 28 { 29 ans++; 30 dfs(i,j); 31 maxn = maxx(area,maxn); 32 area = 0; 33 } 34 printf("%d\n%d\n",ans,maxn); 35 return 0; 36 }