#C08L08P02. C08.L08.深度优先搜索DFS.程序填空.红与黑
C08.L08.深度优先搜索DFS.程序填空.红与黑
题目描述
小明站在一个矩形房间里,这个房间的地面铺满了地砖,每块地砖的颜色或是红色或是黑色。小明一开始站在一块黑色地砖上,并且小明从一块地砖可以向上下左右四个方向移动到其他的地砖上,但是他不能移动到红色地砖上,只能移动到黑色地砖上。
请你编程计算小明可以走到的黑色地砖最多有多少块。
输入格式
每组输入首先是两个正整数 W 和 H,分别表示地砖的列行数。(1 ≤ W,H ≤ 20)
接下来 H 行,每行包含 W 个字符,字符含义如下:
-
“.”表示黑地砖;
-
“#”表示红地砖;
-
“@”表示小明一开始站的位置,此位置是一块黑地砖,并且这个字符在每组输入中仅会出现一个。
输出格式
输出小明可以走到的黑色地砖最多有多少块,包括小明最开始站的那块黑色地砖。
样例
6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
45
11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#..@#.#.
.#.#####.#.
.#.......#.
.#########.
...........
59
11 6
..#..#..#..
..#..#..#..
..#..#..###
..#..#..#@.
..#..#..#..
..#..#..#..
6
7 7
..#.#..
..#.#..
###.###
...@...
###.###
..#.#..
..#.#..
13
程序填空
#include<bits/stdc++.h>
using namespace std;
int n,m,v[25][25],ans= 填空(1) ,w,h;
bool Lock[25][25]; //走过的地方设置为 true
int diff[4][2] = { {-1,0},{1,0},{0,-1},{0,1} }; //4个方向,下标0是往上,下标1是往下,下标2是往左,下标3是往右
void walk(int x,int y)
{
int i,xx,yy;
for(i=0;i<4;i++)
{
xx = x + diff[i][0];
yy = y + 填空(2) ;
if(xx>=1&&xx<=m&&yy>=1&&yy<=n&&v[xx][yy]== 填空(3) && 填空(4) )
{
ans++;
Lock[xx][yy] = 填空(5);
填空(6);
}
}
}
int main()
{
cin>>n>>m;
string s;
for(int i=1;i<=m;i++) //m是代表右多少行
{
cin>>s;
s = "*" +s; //前面随便加个字符,为了后面下标从 1 开始
for(int j=1;j<=n;j++) //每行有 n 个有用的字符,从下标 1 开始到 n
{
if(s[j]=='.') //用 1 来表示黑地砖
v[i][j]=1;
else if(s[j]=='#') //用 2 表示红地砖
v[i][j]=2;
else if(s[j]=='@') //这是起点
{
v[i][j]=1;
w=i;
h=j;
}
}
}
Lock[w][h] = true; //标记这个地方以后不能重复走
walk(w,h); //从 (w,h) 这个坐标开始走,第一个参数是第几行,第二个参数是第几列
cout<<ans;
return 0;
}
填空(1): {{ input(1) }}
填空(2): {{ input(2) }}
填空(3): {{ input(3) }}
填空(4): {{ input(4) }}
填空(5): {{ input(5) }}
填空(6): {{ input(6) }}
相关
在以下作业中: