**题意**
这有一间铺满方形瓷砖的长方形客房。 每块瓷砖的颜色是红色或者黑色。 一个人站在一块黑色瓷砖上, 他可以从这块瓷砖移动到相邻的四块瓷砖中的一块。 但是他只能移动到黑色瓷砖上,而不能移动到红色瓷砖上。
编写一个程序,通过重复上述动作来计算他可以达到的黑色瓷砖的数量。
Input
输入包含多组数据。 每组数据包含两个正整数W和H; H表示瓷砖的行数,W表示瓷砖的列数。 W和H不超过20。
瓷砖的颜色用字符表示,如下所示。
'.' - 黑色瓷砖
'#' - 红色瓷砖
'@' - 站在黑色瓷砖上的人(每组数据中只有一个)
Output
对于每组数据,你的程序应输出一行,其中包含他可以到达的黑色瓷砖数目。(站着的黑色瓷砖也要包含在内)
Sample Input
6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#..@#.#.
.#.#####.#.
.#.......#.
.#########.
...........
11 6
..#..#..#..
..#..#..#..
..#..#..###
..#..#..#@.
..#..#..#..
..#..#..#..
7 7
..#.#..
..#.#..
###.###
...@...
###.###
..#.#..
..#.#..
0 0
Sample Output
45
59
6
13
解题思路
先用双for循环找到人占到那个地方,然后用dfs写,经历过的红地板表示
package DFS;
import java.util.*;
public class REDANDBLACK {
static int n,m,count;
static final int N=1005;
static char map[][]=new char[N][N];
static int dx[]= {0,0,1,-1};
static int dy[]= {1,-1,0,0};
public static void dfs(int x,int y) {
//表示black时count++
if(map[x][y]=='.') {
count++;
map[x][y]='#';
}
//向下衍生,有递归
for(int i=0;i<4;i++) {
int xx=x+dx[i];
int yy=y+dy[i];
if(xx<0||yy<0||xx>=n||yy>=m) {
continue;
}
if(map[xx][yy]=='#') {
continue;
}
dfs(xx,yy);
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
//输入数据
m=sc.nextInt();
n=sc.nextInt();
//表示结束
if(m==0&&n==0) {
break;
}
//输入red black按照列输入
for(int i=0;i<n;i++) {
map[i]=sc.next().toCharArray();
}
count =1;
boolean flag=false;
//找@
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
if(map[i][j]=='@') {
//用dfs开始搜
dfs(i,j);
flag=true;
break;
}
}
if(flag) {
break;
}
}
System.out.println(count);
}
}
}