求解迷宫从入口到出口的路径。输入一个迷宫,求从入口通向出口的可行路径。为简化问题,迷宫用二维数组 int maze[10][10]来存储障碍物的分布,假设迷宫的横向和纵向尺寸的大小是一样的,并由程序运行读入, 若读入迷宫大小的值是n(3<n<=10),则该迷宫横向或纵向尺寸都是n,规定迷宫最外面的一圈是障碍物,迷宫的入口是maze[1][1],出口是maze[n-2][n-2], 若maze[i][j] = 1代表该位置是障碍物,若maze[i][j] = 0代表该位置是可以行走的空位(0<=i<=n-1, 0<=j<=n-1)。求从入口maze[1][1]到出口maze[n-2][n-2]可以走通的路径。要求迷宫中只允许在水平或上下四个方向的空位上行走,走过的位置不能重复走,规定必须按向右、向下、向左、向上的顺序向前搜索试探。 如下这样一个迷宫:
对应的二维数组表示: int maze[10][10]={ {1,1,1,1,1,1,1,1,1,1}, {1,0,0,1,0,0,0,1,0,1}, {1,0,0,1,0,0,0,1,0,1}, {1,0,0,0,0,1,1,0,0,1}, {1,0,1,1,1,0,0,0,1,1}, {1,0,0,0,1,0,0,0,1,1}, {1,0,1,0,0,0,1,0,0,1}, {1,1,1,1,0,1,1,0,1,1}, {1,0,0,0,0,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1,1}};
输入格式:
输入迷宫大小的整数n, 以及n行和n列的二维数组(数组元素1代表障碍物,0代表空位)。
输出格式:
依次输出从入口到出口可行路径每个位置的行列下标(i,j),每个位置间用“,”分隔。若没有通路,输出:NO。
输入样例1:
4
1 1 1 1
1 0 1 1
1 0 0 1
1 1 1 1
结尾无空行
输出样例1:
(1,1)(2,1)(2,2)
结尾无空行
输入样例2:
10
1 1 1 1 1 1 1 1 1 1
1 0 0 1 0 0 0 1 0 1
1 0 0 1 0 0 0 1 0 1
1 0 0 0 0 1 1 0 0 1
1 0 1 1 1 0 0 0 0 1
1 0 0 0 1 0 0 0 0 1
1 0 1 0 0 0 1 0 0 1
1 0 1 1 1 0 1 1 0 1
1 1 0 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1
结尾无空行
输出样例2:
(1,1)(1,2)(2,2)(3,2)(3,1)(4,1)(5,1)(5,2)(5,3)(6,3)(6,4)(6,5)(7,5)(8,5)(8,6)(8,7)(8,8)
结尾无空行
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Stack;
public class Main {
public static void main(String[] args) {
// write your code here
Scanner sc=new Scanner(System.in);
int n=sc.nextInt(),i,j;
int mg[][]=new int[n][n];
Maze m=new Maze(n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
mg[i][j]=sc.nextInt();
}
}
m.create(mg);
if(m.mgth(1,1,n-2,n-2))
m.out();
else
System.out.println("NO");
}
}
class Box {
int i,j,k;
public Box(int i,int j,int k){
this.i=i;
this.j=j;
}
}
class Maze {
ArrayList<Box> arr=new ArrayList<Box>();
int n;
int mg[][];
public Maze(){}
public Maze(int n)
{
this.n=n;
mg=new int[n][n];
}
public void create(int a[][]){
int i=0,j=0;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
mg[i][j]=a[i][j];
}
}
public Boolean mgth(int xi,int yi,int xe,int ye)
{
int i=0,j=0,k = -1,i1=0,j1=0;
Box box,e;
boolean find;
Stack<Box> st=new Stack<Box>();
st.push(new Box(xi,yi,-1));
mg[xi][yi]=-1;
while(!st.empty()) {
k = -1;
box = st.peek();
i = box.i;
j = box.j;
k = box.k;
if (i == xe && j == ye) {
while (!st.empty()) {
e = st.pop();
arr.add(e);
}
return true;
}
find = false;
while (k < 3 && !find) {
k++;
if (k == 3){ i1 = i;
j1 = j - 1;}
else if (k == 0) {i1 = i - 1;
j1 = j;}
else if (k == 1){ i1 = i;
j1 = j + 1;}
else if (k == 2) {i1 = i + 1;
j1 = j;}
if (mg[i1][j1] == 0)
find = true;
}
if (find) {
e = st.pop();
e.k = k;
st.push(e);
st.push(new Box(i1, j1, -1));
mg[i1][j1] = -1;
} else {
mg[i][j] = 0;
st.pop();
}
}
return false;
}
public void out(){
int i=0;
for(i=arr.size()-1;i>=0;i--)
System.out.print("("+arr.get(i).i+","+arr.get(i).j+")");
}
}