I - 红与黑(BFS+DFS)题解

【题目】

有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。Input包括多个数据集合。每个数据集合的第一行是两个整数W和H,分别表示x方向和y方向瓷砖的数量。W和H都不超过20。在接下来的H行中,每行包括W个字符。每个字符表示一块瓷砖的颜色,规则如下 
1)‘.’:黑色的瓷砖; 
2)‘#’:白色的瓷砖; 
3)‘@’:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。 
当在一行中读入的是两个零时,表示输入结束。 
Output对每个数据集合,分别输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷砖)。

Sample Input

6 9 
....#. 
.....# 
...... 
...... 
...... 
...... 
...... 
#@...# 
.#..#. 
0 0

Sample Output

45

【我觉得吧】

模板巨水题,真没什么分析可说,非要说点什么的话,数据小的时候,DFS真香。

【香喷喷的码子来了】

复制代码
 1 #include<iostream> 
 2 #include<string>
 3 using namespace std;
 4 int w,h,vis[30][30];
 5 char mp[30][30];
 6 int sum;
 7 int f[]={0,0,-1,1};
 8 int g[]={1,-1,0,0};
 9 void dfs(int x,int y)
10 {
11     for(int i=0;i<4;i++)
12     {
13         int nx=x+f[i];
14         int ny=y+g[i];
15         if(mp[nx][ny]=='.'&&vis[nx][ny]&&nx>0&&nx<=h&&ny>0&&ny<=w)
16         {
17             vis[nx][ny]=0;sum++;//也可在主函数里遍历找vis=0的个数 
18             dfs(nx,ny);
19             //vis[nx][ny]=1;常规回溯,但本题不需要 
20         }
21     }
22 }
23 int main()
24 {
25     while(cin>>w>>h&&w+h>0)
26     {
27         int x,y;sum=1;
28         for(int i=1;i<=h;i++)
29         for(int j=1;j<=w;j++)
30         {
31             cin>>mp[i][j];
32             vis[i][j]=1;
33             if(mp[i][j]=='@')x=i,y=j;
34         }
35         vis[x][y]=0;
36         dfs(x,y);
37         cout<<sum<<endl;
38     }
39     return 0;
40 }
短短的DFS
复制代码
复制代码
 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <queue>
 4 using namespace std;
 5  
 6 struct node
 7 {
 8     int x,y;
 9 };
10  
11 char map[25][25];
12 int vis[25][25];
13 int n,m,sx,sy,ans;
14 int to[4][2]= {1,0,-1,0,0,1,0,-1};
15  
16 int check(int x,int y)
17 {
18     if(x<0 || y<0 || x>=m || y>=n)
19         return 1;
20     if(vis[x][y] || map[x][y] == '#')
21         return 1;
22     return 0;
23 }
24  
25 void bfs()
26 {
27     int i;
28     queue<node> Q;
29     node a,next;
30     ans = 0;
31     a.x = sx;
32     a.y = sy;
33     vis[sx][sy] = 1;
34     Q.push(a);
35     while(!Q.empty())
36     {
37         ans++;
38         a = Q.front();
39         Q.pop();
40         for(i = 0; i<4; i++)
41         {
42             next = a;
43             next.x+=to[i][0];
44             next.y+=to[i][1];
45             if(check(next.x,next.y))
46                 continue;
47             vis[next.x][next.y] = 1;
48             Q.push(next);
49         }
50     }
51 }
52  
53 int main()
54 {
55     int i,j,flag;
56     while(~scanf("%d%d",&n,&m),n+m>0)
57     {
58         flag = 0;
59         for(i = 0; i<m; i++)
60             scanf("%s",map[i]);
61         for(i = 0; i<m; i++)
62         {
63             for(j = 0; j<n; j++)
64             {
65                 if(map[i][j]=='@')
66                 {
67                     sx = i;
68                     sy = j;
69                     flag = 1;
70                     break;
71                 }
72             }
73             if(flag)break;
74         }
75         memset(vis,0,sizeof(vis));
76         bfs();
77         printf("%d\n",ans);
78     }
79  
80     return 0;
81 }
长长的BFS
复制代码
OVER~
posted @   Renhr  阅读(361)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
点击右上角即可分享
微信分享提示