路径问题系列之HDU1312 Red and Black(DFS)
来源:互联网 发布:java小软件源代码 编辑:程序博客网 时间:2024/06/06 20:38
HDU1312 Red and Black
题目
Time Limit:1000MS Memory Limit:32768KB
- Description
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.
- Input
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)
- Output
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).
- Sample Input
6 9....#......#..............................#@...#.#..#.11 9.#..........#.#######..#.#.....#..#.#.###.#..#.#..@#.#..#.#####.#..#.......#..#########............11 6..#..#..#....#..#..#....#..#..###..#..#..#@...#..#..#....#..#..#..7 7..#.#....#.#..###.###...@...###.###..#.#....#.#..0 0
- Sample Output
45
59
6
13
分析
本题属于路径类题目,由于缺乏经验,刚开始做的时候遇到了不小的阻力,现在和大家分享一些做题时的心得,技巧。首先,整个图是二维的,很自然地使用二维数组保存坐标以及坐标上的内容。其次,无论采用何种遍历节点的方法(DFS/BFS/…)都必须明确一个方向,这时我们可以专门创建一个用于方向变换的二维数组使得代码变得优美,只要移动过后的位置符合题目条件即可,继续进行下一层搜索,并得到答案。
代码
#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using namespace std;char mat[22][22];int num;int w, h;int t[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};void dfs(int i,int j){ mat[i][j] = '#'; for(int k = 0; k<4; k++) { int x = i+t[k][0]; int y = j+t[k][1]; if(x<h && y<w && x>=0 && y>=0 && mat[x][y] == '.') { num++; dfs(x, y); } } return;}int main(){ int x, y; while(scanf("%d%d", &w, &h) == 2 && w+h != 0) { num = 1; for(int i = 0; i<h; i++) { for(int j = 0; j<w; j++) { cin >> mat[i][j]; if(mat[i][j] == '@') { x = i; y = j; } } } dfs(x, y); printf("%d\n", num); } return 0;}
- 路径问题系列之HDU1312 Red and Black(DFS)
- HDU1312 Red and Black [DFS问题]
- hdu1312 poj1979 Red and Black(DFS)
- hdu1312 Red and Black(DFS)
- hdu1312 Red and Black(入门dfs)
- HDU1312 Red and Black(DFS)
- HDU1312 Red and Black(DFS)
- HDU1312 Red and Black(DFS水)
- HDU1312 Red and Black(DFS)
- HDU1312:Red and Black(DFS)
- hdu1312(DFS Red and Black )
- HDU1312:Red and Black(DFS)
- HDU1312 Red and Black DFS
- HDU1312 Red and Black(DFS)
- HDU1312:Red and Black(DFS)
- HDU1312:Red and Black(DFS)
- dfs hdu1312 Red and Black
- hdu1312(Red and Black)
- android 虚拟键适配PopupWindow显示位置
- OSG RTT 渲染到纹理
- 安装配置Zookeeper
- iOS7.2 如何设置导航,不使用系统默认跳转的ViewController
- 文章标题
- 路径问题系列之HDU1312 Red and Black(DFS)
- Meta http-equiv属性详解(转)
- react学习
- 欢迎使用CSDN-markdown编辑器
- NYOJ 1013 除法表达式
- hdu 2037贪心(选择不相交区间)
- Android(三)创建第一个android项目
- create synonym cimmgr.table_B for cimmgr.table_A; alter table cimmgr.table_a rename to table_c;
- MiniGUI输入法模块mGi软键盘使用实例