HDU 1312 Red and Black 红与黑 搜索 dfs bfs
2016-07-21 20:23
405 查看
Red and Black
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 17114 Accepted Submission(s): 10411
Problem 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解法
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 17114 Accepted Submission(s): 10411
Problem 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入门 复制过来的题目描述变得很奇怪。。
#include<iostream> #include<stdio.h> #include<cstring> using namespace std; const int cX[4]={-1,0,0,1}; const int cY[4]={0,-1,1,0}; const int MAX=20+5; int W,H,idx[MAX][MAX],cnt; char pic[MAX][MAX]; void dfs(int x,int y,int id) { if (x<0||x>=H||y<0||y>=W) return; if (idx[x][y]>0||pic[x][y]=='#') return; idx[x][y]=id; cnt++; for (int i=0;i<4;i++) dfs(x+cX[i],y+cY[i],id); } int main() { while (scanf("%D%d",&W,&H)==2&&W&&H) { for (int i=0;i<H;i++) scanf("%s",pic[i]); memset(idx,0,sizeof(idx)); cnt=0; for (int i=0;i<H;i++) for (int j=0;j<W;j++) if (pic[i][j]=='@') dfs(i,j,1); printf("%d\n",cnt); } return 0; }
bfs解法
#include<iostream> #include<stdio.h> #include<cstring> #include<queue> #include<algorithm> #include<functional> #include<vector> #include<iomanip> using namespace std; const int dX[4]={-1,0,0,1}; const int dY[4]={0,-1,1,0}; const int MAX=20+5; int W,H,idx[MAX][MAX],cnt; char pic[MAX][MAX]; bool check(int x,int y) { if (x<0||x>=H||y<0||y>=W) return false; if (idx[x][y]>0||pic[x][y]=='#') return false; return true; } void bfs(int x,int y) { pair<int,int> p=make_pair(x,y); queue<pair<int,int>> Q; idx[x][y]=1; cnt++; Q.push(p); while (!Q.empty()) { pair<int,int> u=Q.front(); Q.pop(); int cx=u.first; int cy=u.second; for (int i=0;i<4;i++) { int nx=cx+dX[i]; int ny=cy+dY[i]; if (check(nx,ny)) { cnt++; idx[nx][ny]=1; Q.push(make_pair(nx,ny)); } } } } int main() { while (scanf("%D%d",&W,&H)==2&&W&&H) { for (int i=0;i<H;i++) scanf("%s",pic[i]); memset(idx,0,sizeof(idx)); cnt=0; for (int i=0;i<H;i++) for (int j=0;j<W;j++) if (pic[i][j]=='@') bfs(i,j); printf("%d\n",cnt); } return 0; }
相关文章推荐
- 嵌入式系统上C++调用C语言接口代码链接时找不到C函数问题处理
- Andriod File 路径转换为Uri
- UVA524 UVALive5270 HDU1016 ZOJ1457 Prime Ring Problem【DFS】
- HDU 4273-G - Rescue-三维凸包求重心
- 从入门到精通:让人又爱又恨的注解(一)
- CodeForces612BHDD is Outdated Technology(sort,结构体,水题)
- php 里邮箱找回密码 的正确格式
- Hibernate 官方文档(入门) 第一章 1.3 - The EventManager web application 简单的web应用
- Android如何通过shareduserid获取系统权限
- 字符串中查找字母有几个
- 个人学习博客1
- Uncowed Forces
- DOM—动态添加table
- 两个大的整数的运算(java)
- Hotel
- Notification
- NYOJ 330 一个简单的数学题【思维】
- HDU 1241 Oil Deposits 油田 搜索
- Restaurant
- Hibernate中,One2Many和Many2One的双向映射关系的XML实现方式