您的位置:首页 > 其它

红黑瓷砖--dfs求解

2017-10-16 14:03 99 查看
有一个矩形房间,覆盖正方形瓷砖。每块瓷砖涂成了红色或者黑色。一名男子站在黑色的瓷砖上,由此出发,可以移到四个相邻瓷砖之一。但是他不能移到红砖上,只能移动到黑砖上。编写一个程序,计算通过重复上述移动所能经过的黑砖数。

输入

输入包含多个数据集,一个数据集开头行包含两个正整数W和H,W和H分别表示矩形房间的列数和行数,且都不超过20。 
每个数据集有H行,其中每行包括W个字符。每个字符的含义如下:‘.’ – 黑砖‘#’ – 红砖‘@’ – 男子当前所在的位置。两个0表示输入结束。

输出

对每个数据集,程序应该输出一行,包含男子从初始瓷砖出发可到达的瓷砖数
import java.util.*;
public class Main {

static Scanner in = new Scanner(System.in);
static int m, n, k, sum = 0, cnt;
static String[] a = new String[505];
static char[][] matrix = new char[505][505];
static int[][] dir = {
{ 0, 1 },
{ 1, 0 },
{ 0, -1 },
{ -1, 0 }
};

static void dfs(int x,int y) {
//		if (x >= n || y >= m|| x < 0 || y < 0)
//			return ;
//如果遇到红瓷砖或者已经走过
if(matrix[x][y]=='#'||matrix[x][y]=='*')
return;
matrix[x][y]='*';//标记走过的
sum++;//计数
//四个方向尝试一遍
for (int i = 0; i < 4; i++) {
int tx, ty;
tx = x + dir[i][0];
ty = y + dir[i][1];
//下标越界处理
if (tx >= n || ty >= m|| tx < 0 || ty < 0)
continue;
dfs(tx,ty);
}
//        dfs(x,y+1);
//        dfs(x+1,y);
//        dfs(x,y-1);
//        dfs(x-1,y);
}
public static void main(String[] args) {
while(in.hasNext()){
int x=0,y=0;
m = in.nextInt();
n = in.nextInt();
if(m==0&&n==0)
break;
for (int i = 0; i < n; i++)
a[i] = in.next();
for (int i = 0; i < n; i++) {
for (int j = 0; j < a[i].length(); j++) {
matrix[i][j] = a[i].charAt(j);
if(matrix[i][j]=='@'){
x=i;
y=j;
}
}
}
sum=0;
dfs(x,y);
System.out.println(sum);
}
}
}


用dfs遍历计算能走过的瓷砖数目,注意标记问题。。。。注释部分是第二种方式,但是好像这种方式快一点点。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: