老鼠走迷宫(栈+纯暴力搜索)

该博客介绍了如何使用二维数组构建迷宫,并通过深度优先搜索(DFS)策略配合栈来寻找从起点到终点的路径。算法从起点开始,依次向下、右、左、上四个方向尝试移动,并标记已走过的位置,当无法前进时回溯。这种方法虽然暴力,但能确保找到至少一条可行路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:首先用二维数组建一个迷宫,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;
	}
	
}

运行结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值