acwing-红与黑(dfs和bfs两个版本)
有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。
你站在其中一块黑色的瓷砖上,只能向相邻(上下左右四个方向)的黑色瓷砖移动。
请写一个程序,计算你总共能够到达多少块黑色的瓷砖。
输入格式
输入包括多个数据集合。
每个数据集合的第一行是两个整数 WW 和 HH,分别表示 xx 方向和 yy 方向瓷砖的数量。
在接下来的 HH 行中,每行包括 WW 个字符。每个字符表示一块瓷砖的颜色,规则如下
1)‘.’:黑色的瓷砖;
2)‘#’:红色的瓷砖;
3)‘@’:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。
当在一行中读入的是两个零时,表示输入结束。
输出格式
对每个数据集合,分别输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷砖)。
数据范围
1≤W,H≤201≤W,H≤20
输入样例:
6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
0 0
输出样例:
45
dfs版本
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 using namespace std; 6 7 const int N=20; 8 9 int n,m; 10 char g[N][N]; 11 int dist[N][N]; 12 int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1}; 13 14 15 int dfs(int x,int y) 16 { 17 int cnt=1; 18 19 dist[x][y]=1; 20 21 for(int i=0;i<4;i++) 22 { 23 int a=x+dx[i],b=y+dy[i]; 24 if(a<0||a>=n||b<0||b>=m) continue; 25 if(g[a][b]!='.') continue; 26 if(dist[a][b]) continue; 27 28 cnt+=dfs(a,b); 29 } 30 return cnt; 31 } 32 33 int main() 34 { 35 while(cin>>m>>n,n||m) 36 { 37 int x,y; 38 for(int i=0;i<n;i++) cin>>g[i]; 39 40 for(int i=0;i<n;i++) 41 for(int j=0;j<m;j++) 42 { 43 if(g[i][j]=='@') 44 { 45 x=i; 46 y=j; 47 break; 48 } 49 } 50 memset(dist,0,sizeof dist); 51 cout<<dfs(x,y)<<endl; 52 53 } 54 return 0; 55 }
BFS版本
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 #include<queue> 6 using namespace std; 7 8 typedef pair<int,int> PII; 9 10 const int N=20; 11 12 int n,m; 13 char g[N][N]; 14 int dist[N][N]; 15 int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1}; 16 17 int bfs(int x,int y) 18 { 19 int cnt = 1; 20 queue<PII> q; 21 dist[x][y]=1; 22 23 q.push({x,y}); 24 while(q.size()) 25 { 26 auto t = q.front(); 27 q.pop(); 28 int x=t.first,y=t.second; 29 for(int i=0;i<4;i++) 30 { 31 int a=x+dx[i],b=y+dy[i]; 32 if(a<0||a>=n||b<0||b>=m) continue; 33 if(g[a][b]!='.') continue; 34 if(dist[a][b]) continue; 35 dist[a][b]=1; 36 q.push({a,b}); 37 cnt++; 38 } 39 } 40 return cnt; 41 } 42 43 int main() 44 { 45 while(cin>>m>>n,n||m) 46 { 47 int x,y; 48 for(int i=0;i<n;i++) cin>>g[i]; 49 50 for(int i=0;i<n;i++) 51 for(int j=0;j<m;j++) 52 { 53 if(g[i][j]=='@') 54 { 55 x=i; 56 y=j; 57 break; 58 } 59 } 60 memset(dist,0,sizeof dist); 61 cout<<bfs(x,y)<<endl; 62 63 } 64 return 0; 65 }
希望有用

浙公网安备 33010602011771号