Red and Black
2016-04-13 11:09
183 查看
问题描述
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.
输入
The 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 are not 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)
The end of the input is indicated by a line consisting of two zeros.
输出
For each data set, your program should output a line which contains the number of tiles he can reach from the initial tile (including itself).
样例输入
样例输出
View Code
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.
输入
The 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 are not 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)
The end of the input is indicated by a line consisting of two zeros.
输出
For each data set, your program should output a line which contains the number of tiles he can reach from the initial tile (including itself).
样例输入
6 9 ....#. .....# ...... ...... ...... ...... ...... #@...# .#..#. 11 9 .#......... .#.#######. .#.#.....#. .#.#.###.#. .#.#..@#.#. .#.#####.#. .#.......#. .#########. ........... 11 6 ..#..#..#.. ..#..#..#.. ..#..#..### ..#..#..#@. ..#..#..#.. ..#..#..#.. 7 7 ..#.#.. ..#.#.. ###.### ...@... ###.### ..#.#.. ..#.#.. 0 0
样例输出
45 59 6 13 经典搜索算法BFS。用一个队列保存当前可以到达的位置,每存入一个位置就将这个位置标记为已经遍历过,然后每次从队列pop一个位置,并对该位置扩展可到达位置存入到队列中,直到队列为空。
#include <iostream> #include <queue> using namespace std; char map[25][25]; int dx[8]={-1,0,1,0,1,-1,-1,1}, dy[8]={0,-1,0,1,1,-1,1,-1}; void dfs(int x,int y); int toatl=0,m,n; typedef struct Pos{ int x; int y; }P; queue<P> que; P start; int main() { while(cin>>n>>m) { if(n==0&&m==0) break; toatl=0; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { cin >> map[i][j]; if (map[i][j] == '@') { start.x = i; start.y = j; } } } que.push(start); while(que.size()){ P t=que.front(); que.pop(); toatl++; for(int i=0;i<4;i++){ P tmp; tmp.x=t.x+dx[i]; tmp.y=t.y+dy[i]; if(tmp.x>=0&&tmp.x<m&&tmp.y>=0&&tmp.y<n&&map[tmp.x][tmp.y]=='.'){ que.push(tmp); /* 标记已经遍历过 */ map[tmp.x][tmp.y]='*'; } } } cout<<toatl<<endl; } return 0; }
View Code
相关文章推荐
- JS在线编辑器
- Android通过ScaleGestureDetector实现图片缩放
- 兼容windows、mac的视频播放
- cv1.6hist直方图操作
- U-boot分析与移植(5)----U-boot移植
- memcache适用和不适用场景总结
- js数组添加或删除元素
- 根据不同分辨率加载不同 css 样芪表
- 如何实现高效的事件管理?
- Python 进阶 —— 使用 map reduce
- 使用ScrollView属性fillViewport解决android布局不能撑满全屏的问题
- 移动端Flex 布局新旧混合兼容
- Java中List集合被大家忽略的一个问题
- 排序算法---冒泡排序
- 析构函数的调用顺序
- U-boot分析与移植(4)-U-boot 添加命令
- 利用pod trunk发布程序,让你的项目可以被pod search
- 线程创建方式
- java 获取classpath下文件多种方式
- linux内核驱动中_IO, _IOR, _IOW, _IOWR 宏的用法与解析(引用)