题目描述:
某个人站在一个由黑白方格构成的矩形区域中,他从某个黑色方格出发,向上下左右四个方向移动,每次只能从一个黑色方格移动到另一个黑色方格,问他最多能够走多少个黑色方格。
输入要求:
输入数据的第一行包含两个整数 l 和 w,表示矩形区域的宽度(列数)和高度(行数),也就是水平和垂直方向上方格的数量。其后的 w 行,每一行有 l 个字符,由“.”,”#”和“@”符号构成,分别表示黑色方格,白色方格和人起始所在的黑色方格。
输出要求:
输出一个整数,表示他最多能走的黑色方格的数量,占一行。
测试用例:
11 9
. # . . . . . . . . .
. # . # # # # # # # .
. # . # . . . . . # .
. # . # . # # # . # .
. # . # . . @ # . # .
. # . # # # # # . # .
. # . . . . . . . # .
. # # # # # # # # # .
. . . . . . . . . . .
结果是59
代码如下
#include<iostream>
using namespace std;
char a[100][100];
int dx[4] = { 1,-1,0,0 };
int dy[4] = { 0,0,1,-1 };
int l, w;
int sum = 0;
void dfs(int p, int q) {
a[p][q] = '#';
sum++;
int nx, ny;
for (int i = 0; i < 4; i++) {
nx = p + dx[i];
ny = q + dy[i];
if (a[nx][ny] == '.' && p >= 0 && q >= 0 && nx < w && ny < l)
dfs(nx, ny);
}
return;
}
int main() {
cin >> l >> w;
for (int i = 0; i < w; i++)
for (int j = 0; j < l; j++)
cin >> a[i][j];
for (int i = 0; i < w; i++)
for (int j = 0; j < l; j++)
if (a[i][j] == '@')
dfs(i, j);
cout << sum;
return 0;
}