POJ - 1979-Red and Black
2016-07-28 15:29
501 查看
Red and Black
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d
& %I64u
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
Sample Output
题意:就是让你从起点“@”开始遍历所有能走到的“.”,可以按原路返回,但不再计数。注意:先输入的w是列数,后输入的h是行数。
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d
& %I64u
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
题意:就是让你从起点“@”开始遍历所有能走到的“.”,可以按原路返回,但不再计数。注意:先输入的w是列数,后输入的h是行数。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int w,h,ans,a,b; char map[25][25]; bool vis[25][25];//辅助数组,走过的记为true,避免重复计算,陷入死循环 int px[4]={-1,0,1,0}; int py[4]={0,1,0,-1}; int dfs(int a,int b){ for(int i=0;i<4;i++){ int x=a+px[i]; int y=b+py[i];//移动后的位置 if(map[x][y]=='.'&&vis[x][y]==false){ vis[x][y]=true; ans++;//计数器 dfs(x,y);//递归调用自身,遍历完所有情况 } } return ans; } int main(){ while(scanf("%d%d",&w,&h),w||h){ memset(vis,false,sizeof(vis));//辅助数组初始化 memset(map,'#',sizeof(map));//将图全部初始化为#,防止越界 ans=0;//计数器初始化 for(int i=1;i<=h;i++){//从1开始!! getchar();//吸收空行键 for(int j=1;j<=w;j++){ scanf("%c",&map[i][j]); if(map[i][j]=='@'){ a=i,b=j; vis[i][j]=true;//记录@的位置,即dfs的起点 } } } printf("%d\n",dfs(a,b)+1);//加上@本身的位置 } return 0; }
相关文章推荐
- O(1)快速乘注意事项
- SPFA
- Android ServiceConnection
- zookeepeer选举master
- 权限修饰符
- 【Android基础知识】Android Studio 编译慢及 Adb connection Error:远程主机强迫关闭了一个现有的连接
- AC多模匹配算法过滤敏感词实例
- 针对域名做iptables
- C#实现字符串倒叙方法整理
- 广义线性模型.多项式分布.softmax
- NodeJS 异步变同步的方法遍历文件夹
- 最长公共子序列求解:递归与动态规划方法
- Web项目上传文件失败
- c语言和c++的输入,输出和异常
- thinkphp3.2.3 分页代码分享
- Django笔记---用户注册和登录验证(1)--Post请求
- iOS Block原理简析
- 代理设计模式Demo
- 包
- 进程与线程的区别(转)