Red and Black(BFS和DFS)
题目:
有一个长方形的房间,覆盖了正方形的磁砖。每块磁砖的颜色,要么是红色,要么是黑色。一名男子站在一块黑色的磁砖上。他可以从一块磁砖移至相邻四块磁砖中的某一块。但是,他不允许在红色磁砖上移动,他只允许在黑色磁砖上移动。
编写一个程序,使得他允许重复上述的移动,判断他所能到达的黑色磁砖的数量。
输入
在数据集中,还有 H 行,每行包含了 W 个字符。每个字符按如下方式表示一块磁砖的颜色。
'.' - 一块黑色的磁砖
'#' - 一块红色的磁砖
'@' - 一名男子,站在一块黑色磁砖上 (在一个数据集中,恰好出现一次)
以包含两个 0 的一行,表示输入结束。
输出
示例输入
6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#..@#.#.
.#.#####.#.
.#.......#.
.#########.
...........
11 6
..#..#..#..
..#..#..#..
..#..#..###
..#..#..#@.
..#..#..#..
..#..#..#..
7 7
..#.#..
..#.#..
###.###
...@...
###.###
..#.#..
..#.#..
0 0
示例输出
45
59
6
13
分析:
用BFS遍历,遍历过的标记为1,当前进到的地点在规定的范围内是黑色,并且没有遍历过的时候,num+1;
注意下面的这个情形:
输入:
3 3
#.#
@#.
#.#
正确的输出:1 (因为@当前正处在黑色方格上)
BFS代码:
#include<iostream> #include<cstring> #include<queue> using namespace std; char a[25][25]; int flag[4][2]={1,0,-1,0,0,1,0,-1}; int m[25][25]; int num,fg; struct knot { int x,y; }; knot t,b,c; int h,w; void bfs(int f,int e) { queue<knot>s; fg=0; t.x=f; t.y=e; num=1; s.push(t); while(!s.empty()) { b=s.front(); s.pop(); for (int i=0;i<4;i++) { t.x=b.x+flag[i][0]; t.y=b.y+flag[i][1]; if (t.x>0&&t.x<=w&&t.y>0&&t.y<=h&&a[t.x][t.y]!='#'&&!m[t.x][t.y]) { fg=1; num++; m[t.x][t.y]=1; s.push(t); } } } } int main() { int x,y; while (cin>>h>>w&&(h!=0||w!=0)) { memset(m,0,sizeof(m)); for (int i=1;i<=w;i++) for (int j=1;j<=h;j++) { cin>>a[i][j]; if (a[i][j]=='@') x=i,y=j; } bfs(x,y); if (fg==1) cout << num-1 << endl; else cout << num << endl; } return 0; }
DFS代码:
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
char a[25][25];
int flag[4][2]={1,0,-1,0,0,1,0,-1};
int m[25][25];
int num,fg;
struct knot
{
int x,y;
};
knot t,b,c;
int h,w;
void dfs(int f,int e)
{
for (int i=0;i<4;i++)
{
int xi=f+flag[i][0];
int yi=e+flag[i][1];
if (xi>0&&xi<=w&&yi>0&&yi<=h&&a[xi][yi]!='#'&&!m[xi][yi])
{
m[xi][yi]=1;
num++;
dfs(xi,yi);
}
}
}
int main()
{
int x,y;
while (cin>>h>>w&&(h!=0||w!=0))
{
num=0;
memset(m,0,sizeof(m));
for (int i=1;i<=w;i++)
for (int j=1;j<=h;j++)
{
cin>>a[i][j];
if (a[i][j]=='@')
x=i,y=j;
}
dfs(x,y);
cout << num << endl;
}
return 0;
}