HDOJ1312 Red and Black 深搜dfs
2016-03-05 21:06
344 查看
Red and Black
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 15340 Accepted Submission(s): 9498
[align=left]Problem Description[/align]
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.
[align=left]Input[/align]
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)
[align=left]Output[/align]
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).
[align=left]Sample Input[/align]
6 9 ....#. .....# ...... ...... ...... ...... ...... #@...# .#..#. 11 9 .#......... .#.#######. .#.#.....#. .#.#.###.#. .#.#..@#.#. .#.#####.#. .#.......#. .#########. ........... 11 6 ..#..#..#.. ..#..#..#.. ..#..#..### ..#..#..#@. ..#..#..#.. ..#..#..#.. 7 7 ..#.#.. ..#.#.. ###.### ...@... ###.### ..#.#.. ..#.#.. 0 0
[align=left]Sample Output[/align]
45 59 6 13
#include<iostream> #include<cstdio> using namespace std; char str[25][25]; int w,h; int dfs(int a,int b) { if(str[a][b]=='#'||a>=h||a<0||b<0||b>=w)//到边界就结束,闪人 return 0; else { str[a][b]='#';//走过的地方都更新为墙--‘#’ return 1+dfs(a-1,b)+dfs(a+1,b)+dfs(a,b+1)+dfs(a,b-1); //四个方向。又因为七点也是一个,所以加一 } } int main() { int i,j,p,q,sum; while(~scanf("%d%d",&w,&h)&&w&&h) { for(i=0;i<h;i++) scanf("%s",str[i]); for(i=0;i<h;i++)//h行 { for(j=0;j<w;j++)//w列 { if(str[i][j]=='@') p=i,q=j; } } sum=dfs(p,q); cout << sum <<endl; } return 0; }
相关文章推荐
- linux shell脚本 -- 定时任务--备份日志
- Web CORS 跨域方式使用方式
- Adam学习1之环境搭建(含window下eclipse配置)
- linux下vim的简单配置
- 基于Spark的异构分布式深度学习平台
- 欢迎使用CSDN-markdown编辑器
- 读《深入php面向对象、模式与实践》有感(三)
- 读《深入php面向对象、模式与实践》有感(三)
- Linux的僵尸进程处理1
- LeetCode 290. Word Pattern
- java 值传递与地址传递(引用)的区别
- UESTC oj 758 P酱的冒险旅途
- 理解进程内存
- Struts中ActionContext和ServletActionContext的比较
- Eclipse上安装GIT插件EGit及使用
- php header setcookie headers_sent函数 函数检查 HTTP 标头是否已被发送以及在哪里被发送
- Twisted中的putChild和getChild
- bzoj 3122 随机数生成器
- android.view.InflateException异常原因及解决方案
- AndroidContext菜单