关于BFS搜索的思想, 最简单的水题,不过深有体会啊。
2014-08-13 11:23
716 查看
There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A man is standing on a black tile. From a tile, he can move to one of four adjacent tiles. But he can't move on red tiles, he can move only on black tiles.Write a program to count the number of black tiles which he can reach by repeating the moves described above.InputThe input consists of multiple data sets. A data set starts with a line containing two positive integers W and H; W and H are the numbers of tiles in the x- and y- directions, respectively.W and H arenot more than 20.There are H more lines in the data set, each of which includes W characters. Each character represents the color of a tile as follows.'.' - a black tile'#' - a red tile'@' - a man on a black tile(appears exactly once in a data set)OutputFor each data set, your program should output a line which contains the number of tiles he can reach from the initial tile (including itself).Sample Input
6 9 ....#. .....# ...... ...... ...... ...... ...... #@...# .#..#. 11 9 .#......... .#.#######. .#.#.....#. .#.#.###.#. .#.#..@#.#. .#.#####.#. .#.......#. .#########. ........... 11 6 ..#..#..#.. ..#..#..#.. ..#..#..### ..#..#..#@. ..#..#..#.. ..#..#..#.. 7 7 ..#.#.. ..#.#.. ###.### ...@... ###.### ..#.#.. ..#.#.. 0 0Sample Output
45 59 6 13
相当于遍历一个二维数组,然后在能走到的范围里面计数能到达的位置。 很简单,就不停的递归就可以了。
#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#include <cmath>#include <cstdlib>#include <queue>#include <stack>using namespace std;int cont; int M,N,i,j,k,t;char a[25][25];bool b[25][25];void bfs(int i ,int j){ if(i>0&&a[i-1][j]=='.'&&b[i-1][j]==0) { if(b[i-1][j]==0) cont++; b[i-1][j]=1; bfs(i-1,j); } if(j>0&&a[i][j-1]=='.'&&b[i][j-1]==0) { if(b[i][j-1]==0) cont++; b[i][j-1]=1; bfs(i,j-1); } if(i<M-1&&a[i+1][j]=='.'&&b[i+1][j]==0) { if(b[i+1][j]==0) cont++; b[i+1][j]=1; bfs(i+1,j); } if(j<N-1&&a[i][j+1]=='.'&b[i][j+1]==0) { if(b[i][j+1]==0) cont++; b[i][j+1]=1; bfs(i,j+1); }}int main(){ while(scanf("%d%d",&N,&M)!=EOF) { if(M==0&&N==0) break; cont=1; getchar(); memset(b,0,sizeof(b)); for(i=0;i<M;i++) { for(j=0;j<N;j++) { scanf("%c",&a[i][j]); if(a[i][j]=='@') { k=i; t=j; b[i][j]=1; } } getchar(); } bfs(k,t); printf("%d\n",cont); }return 0;}
相关文章推荐
- POJ 3414-Pots 简单搜索 BFS
- 关于Google中国,百度搜索,Bing搜索,雅虎,搜搜,以及有道的简单测试
- poj1562 Oil Deposits 简单搜索,dfs和bfs都行,我用的bfs
- 专题 简单搜索(bfs+dfs) 个人题解
- A strange lift HDU 1548 queue BFS 简单 水题
- 最大流最小割算法; BFS搜索增广路径; 算法简单,打印结果也比较清晰;
- 蓝桥杯 暗恋 简单搜索或者暴力或者bfs
- zoj 1091 BFS简单搜索
- BFS宽度优先搜索思想
- poj 2251 简单搜索bfs
- 简单的new操作重载以及关于内存的一些体会
- HOJ 1440 Knight Moves -------简单搜索 BFS 求l两点之间最小的到达步数
- poj 1562 简单的BFS搜索
- 关于哈希思想的一点简单理解
- HDU/HDOJ 1312 Red and Black 非常简单的搜索题 BFS
- 关于简单模式的一点体会
- BFS简单搜索--POJ 2243
- 交换地方HDU 1195 Open the Lock 简单搜索-bfs
- 找朋友(bfs)搜索(还有队列思想)
- poj 3278 简单搜索bfs