Description
有一间长方形的房子,地上铺了白色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。
Input
包括多个数据集合。每个数据集合的第一行是两个整数W和H,分别表示x方向和y方向瓷砖的数量。W和H都不超过20。在接下来的H行中,每行包括W个字符。每个字符表示一块瓷砖的颜色,规则如下
1)‘.’:黑色的瓷砖;
2)‘#’:白色的瓷砖;
3)‘@’:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。
当在一行中读入的是两个零时,表示输入结束。
Output
对每个数据集合,分别输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷砖)。
Sample Input
6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
0 0
Sample Output
45
HINT
Source
【AC代码】:
import java.util.Scanner;
public class Main {
static int w;
static int h;
static int sum = 0;//总共可以走的步数
static char b[][] = new char[21][21];//储存字符
static boolean a[][] = new boolean[21][21];//判断当前位置是否搜索过
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
w = sc.nextInt();
h = sc.nextInt();
sum = 1;//@存在的地方为第一步
if (w == 0 && h == 0)//输入0 0退出程序
return;
int x = 0, y = 0;
for (int i = 1; i <= h; i++) {
String s = sc.next();
for (int j = 1; j <= w; j++) {
b[i][j] = s.charAt(j - 1);
if (b[i][j] == '@') {
x = i;
y = j;
}
}
}
dfs(x, y);//从@所在的地方开始进行搜索
System.out.println(sum);
}
}
private static void dfs(int x, int y) {
// TODO Auto-generated method stub
if (x > h || x < 1 || y < 1 || y > w || b[x][y] == '#')
return;//不满足条件时退出
else {
if (a[x][y])//搜索过当前位置时退出
return;
if (b[x][y] == '.') {
a[x][y] = true;//搜索过当前位置标记为真
sum++;//步数加1
}
/**搜索当前点的上下左右位置*/
dfs(x, y + 1);
dfs(x, y - 1);
dfs(x + 1, y);
dfs(x - 1, y);
}
}
}