城堡问题 OpenJ_Bailian - 2815

原题链接

考察: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 }

 

posted @ 2021-03-07 21:08  acmloser  阅读(50)  评论(0编辑  收藏  举报