.代表黑格子,#代表红格子,@代表人的位置。
只能在黑格子上移动,首先我们找到人的位置,然后dfs一次,把黑格子替换成红格子。每dfs一次,一个黑格子就变成红格子。直至所有的可以行走的黑格子变成红格子后,结果就出来了。
深搜就是一直往前
不行回退
#include<cstdio>
int W, H;
char map[21][21];
int dx[4] = { 0, 0, 1, -1 };//上下左右方向移动
int dy[4] = { 1, -1, 0, 0 };
int count = 0;
void dfs(int x,int y)//每dfs一次,可以移动的范围就加1
{
count++;
map[x][y] = '#';
for (int i = 0; i < 4; i++){
int nx = x + dx[i];
int ny = y + dy[i];
if (0 <= nx&&nx < H && 0 <= ny&&ny < W&&map[nx][ny] != '#')dfs(nx, ny);//如果位置符合条件,进行一次dfs
}
}
int main()
{
scanf("%d%d", &W, &H);
while (getchar() != '\n')continue;//吃掉回车,否则输入流中会留下回车
while (W != 0 && H != 0){
count = 0;//初始化移动范围
for (int i = 0; i < H; i++){
gets(map[i]);
}
for (int i = 0; i < H; i++){
for (int j = 0; j < W; j++){
if (map[i][j] == '@'){ //找到@就开始dfs
dfs(i, j);
}
}
}
printf("%d\n", count);
scanf("%d%d", &W, &H);
while (getchar() != '\n')continue;
}
}