迷宫
基础迷宫问题
package Test;
/**
* Created by wolf on 2016/3/21.
*/
public class DFS迷宫 {
/**
* 定义迷宫数组
*/
private int[][] array = {
{ 0, 1, 0, 0, 0, 1 },
{ 0, 0, 0, 1, 0, 0 },
{ 1, 0, 1, 0, 0, 1 },
{ 1, 0, 0, 1, 0, 1 },
{ 1, 1, 0, 0, 0, 0 }
};
private int maxRow = 5; //行数
private int maxLine = 6; //列数
private void print() {
System.out.println("得到一个解:");
for (int i = 0; i < maxRow; i++) {
for (int j = 0; j < maxLine; j++) {
//System.out.print(array[i][j] + " "); //输出结果矩阵
if(array[i][j]==5) {
System.out.printf("(%d,%d)->",i,j);
}
}
//System.out.println();
}
System.out.printf("(%d,%d)",maxRow-1,maxLine-1); //如果右下角不是终点时,这一句要删掉
System.out.println();
}
private boolean canMove(int i, int j, int targetI, int targetJ) {
// System.out.println("从第" + (i + 1) + "行第" + (j + 1) + "列,走到第" + (targetI + 1) + "行第" + (targetJ + 1) + "列");
if (targetI < 0 || targetJ < 0 || targetI >= maxRow || targetJ >= maxLine) {
// System.out.println("到达最左边或最右边,失败了");
return false;
}
if (array[targetI][targetJ] == 1) {
// System.out.println("目标是墙,失败了");
return false;
}
// 避免在两个空格间来回走
if (array[targetI][targetJ] == 5) {
// System.out.println("来回走,失败了");
return false;
}
return true;
}
private void check(int i, int j) {
// 如果到达右下角出口
if (i == maxRow - 1 && j == maxLine - 1) { //可更改终点.现在的终点是右下角
print();
return;
}
// 向右走
if (canMove(i, j, i, j + 1)) {
array[i][j] = 5;
check(i, j + 1);
array[i][j] = 0;
}
// 向左走
if (canMove(i, j, i, j - 1)) {
array[i][j] = 5;
check(i, j - 1);
array[i][j] = 0;
}
// 向下走
if (canMove(i, j, i + 1, j)) {
array[i][j] = 5;
check(i + 1, j);
array[i][j] = 0;
}
// 向上走
if (canMove(i, j, i - 1, j)) {
array[i][j] = 5;
check(i - 1, j);
array[i][j] = 0;
}
}
public static void main(String[] args) {
new DFS迷宫().check(0, 0); //可更改起点.现在的起点是左上角
// System.out.println(System.currentTimeMillis());
}
}