POJ 1979 红与黑 优先深度搜索
2016-03-27 22:31
176 查看
题目连接
http://poj.org/problem?id=1979Description
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)
The end of the input is indicated by a line consisting of two zeros.
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
4559
6
13
Hint
题意
一次性相连的‘ . ’有多少个题解
其实和水洼那题差不多,区别是数据简单处理一下,还有就是这次只能上下左右搜索而不是周围八个格子都搜索代码
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<string> #include<cctype> #include<algorithm> #include<vector> #define INF 1e9+7 int n,m,ans; int dx[4]={-1,0,1,0}; int dy[4]={0,1,0,-1}; using namespace std; char a[110][110]; void dfs(int q,int p){ a[q][p]='#'; for (int i = 0; i <4 ; ++i) { int nx=q+dx[i]; int ny=p+dy[i]; if (a[nx][ny]=='.'&&nx>=0&&nx<m&&ny>=0&&ny<n) { //a[q+i][p+j]='.'; ans++; dfs(nx,ny); } } } int main(int argc, char const *argv[]) { ans=1; fflush(stdin); //清空输入流 上一个scanf预留的\n while(scanf("%d%d",&n,&m)!=EOF){ memset(a,0,sizeof(a)); ans=1; if (n==0&&m==0) { return 0; } int z,g; for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { cin>>a[i][j]; if(a[i][j]=='@'){ z=i; g=j;} // scanf("%c",&a[i][j]); } } dfs(z,g); printf("%d\n",ans ); } return 0; }
相关文章推荐
- 随便写写
- 第五周项目1 三角形类练习(1)
- 触发器使用教程和命名规范
- 20145222黄亚奇《Java程序设计》第4周学习总结
- 20145239杜文超 《Java程序设计》第4周学习总结
- 正式开始重新学习java
- 在Google Maps 上点击标签后显示说明
- 敏捷开发方法综述
- 副本构造器
- J2EE持久层框架mybatis配置文件写法
- 6.0判断权限
- JAVA第二次作业
- Less - 语法及例子
- [Java8 Collection源码+算法+数据结构]-Map+Set(一)
- XGBoost-Python完全调参指南-参数解释篇
- 如何用形象的比喻描述大数据的技术生态?Hadoop、Hive、Spark 之间是什么关系?
- 第四周作业链接
- 论文心得:BatchNorm的那些变体
- 【面试】Dell
- [LeetCode][JavaScript]Maximum Subarray