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 }

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 }
OVER~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!