思路:首先用二维数组建一个迷宫,0可以走,1不可以走,然后从第一个位置开始走,先向下走,在向右走,向左走,向上走,走过的位置标记一下,储存到栈里面,然后每到一个位置都判断一下它是不是还能继续向前走(不能向前走的话就取出栈顶元素并向后退一步),然后一直走直到能够走到终点。
这种方法是暴力的深搜法,只能求到一种路径。
package SearchRat;
public class RatTest {
public static void main(String [] args)
{
int m=14;
int n=15;//迷宫的起始位置
//创建迷宫
int [][] a=new int[16][17];
for(int i=0;i<16;i++)
for(int j=0;j<17;j++)
a[i][j]=0;
for(int i=0;i<17;i++)a[0][i]=1;
for(int i=0;i<17;i++)a[15][i]=1;
for(int i=0;i<16;i++)a[i][0]=1;
for(int i=0;i<16;i++)a[i][16]=1;
a[1][11]=1;
a[2][2]=1;
for(int i=5;i<11;i++)a[2][i]=1;
a[3][2]=1;
a[3][4]=1;a[3][5]=1;
a[4][2]=1;a[4][3]=1;a[4][4]=1;
a[5][5]=1;for(int i=9;i<14;i++)a[5][i]=1;
a[6][2]=1; a[6][3]=1; a[6][4]=1; a[6][13]=1;
a[7][2]=1;a[7][3]=1;
a[8][2]=1;a[8][3]=1;a[8][8]=1;a[8][10]=1;a[8][12]=1;a[8][14]=1;a[8][15]=1;
a[9][5]=1;
for(int i=10;i<14;i++){a[i][2]=1;a[i][3]=1;}a[14][3]=1;a[10][7]=1;
a[11][6]=1;a[11][7]=1;a[11][12]=1;
for(int i=7;i<13;i++)a[12][i]=1;
a[13][12]=1;a[14][13]=1;
for(int i=0;i<m+2;i++)
{
for(int j=0;j<n+2;j++)
System.out.print(a[i][j]+" ");
System.out.println();
}
//开始走迷宫了
int i=1;
int j=1;
SearchStack stack=new SearchStack();
while(!(i==m&&j==n))
{
int k1=1; //k1的作用是记录当前能不能向下走,k2,k3,k4同理
//向下走
while(a[i+1][j]==0)
{
Node node =new Node(i+1,j);
stack.InStack(node);
i++;
a[i][j]=2;
k1=0;
}
//向右走
int k2=1;
while(a[i][j+1]==0)
{
j++;
Node node=new Node(i,j);
stack.InStack(node);
a[i][j]=2;
k2=0;
}
//向左走
int k3=1;
while(a[i][j-1]==0)
{
j--;
Node node=new Node(i,j);
stack.InStack(node);
a[i][j]=2;
k3=0;
}
//向上走
int k4=1;
while(a[i-1][j]==0)
{
i--;
Node node=new Node(i,j);
stack.InStack(node);
a[i][j]=2;
k4=0;
}
//都不能走的话就退一步
if(k1+k2+k3+k4>3)
{
i=stack.back.getLine();
j=stack.back.getRaw();
a[stack.top.getLine()][stack.top.getRaw()]=1;
stack.OutStack();
}
}
stack.StackPrint();
System.out.println("(14,15)");
}
}
package SearchRat;
public class SearchStack {
public Node head;
public Node pointer;
public Node top;
public Node back;
public SearchStack()
{
head=new Node();
Node node=new Node(1,1);
head.LinkNext(node);
top=node;
back=top;
}
public void InStack(Node node)
{
top.LinkNext(node);
back=top;
top=node;
}
public void OutStack()
{
pointer=head.next();
Node q=pointer;
Node q1=q;
while(pointer.next()!=null)
{
q1=q;
q=pointer;
pointer=pointer.next();
}
top=q;
back=q1;
q.LinkNext(null);
}
public void StackPrint()
{
pointer=head.next();
int i=0;
while(pointer!=top)
{
System.out.print("("+pointer.getLine()+","+pointer.getRaw()+")-->");
pointer=pointer.next();
i++;
if(i==5)
{
System.out.println();
i=0;
}
}
pointer=top;
System.out.print("("+pointer.getLine()+","+pointer.getRaw()+")-->");
}
}
class Node{
Node next;
int line;
int raw;
public Node(int line,int raw){
this.line=line;
this.raw=raw;
}
public Node()
{
}
public int getLine()
{
return this.line;
}
public int getRaw()
{
return this.raw;
}
public void LinkNext(Node node)
{
this.next=node;
}
public Node next()
{
return this.next;
}
}
运行结果: