c++递归模拟迷宫寻路问题

  • #include<iostream>
    using namespace std;
    
    //递归模拟迷宫回溯
    bool setWay(int arr[][10],int i,int j)
    {
    	if(arr[8][8]==2)
    		return true;
    	//挡板为1,空格为0,走过是通路为2,走过不是通路为3;
    	else
    	{
    	  if(arr[i][j]==0)
    	  {  arr[i][j]=2;
    		 //策略为下右上左
    		 if(setWay(arr,i+1,j))  return true;
    		 else if(setWay(arr,i,j+1))  return true;
    	     else if(setWay(arr,i-1,j))  return true;
    		 else if(setWay(arr,i,j-1))  return true;
    		 else 
    		 {
    			arr[i][j]=3;
    		    return false;
    		 }
    	  }	
    	  else 
    		  return false;
    	}
    
    }
    int main()
    {
      int i,j,sum=0;
      int arr[10][10]={0};
      for(i=0;i<10;i++)
      {
    	  arr[0][i]=1;
          arr[9][i]=1;
    	  arr[i][0]=1;
    	  arr[i][9]=1;
      }
      //设置挡板
      arr[1][3]=1;
      arr[1][4]=1;
      arr[2][4]=1;
      arr[1][6]=1;
      arr[3][3]=1;
      arr[5][2]=1;
      arr[6][5]=1;
      arr[7][4]=1;
      arr[6][1]=1;
      printf("原始迷宫:\n");
      for(i=0;i<10;i++)
    	 {
    		 for(j=0;j<10;j++)
    		 {
    			 cout<<arr[i][j]<<" ";
              }
    		 cout<<endl;
         }
      setWay(arr,1,1);
      cout<<"走完迷宫后"<<endl;
      for(i=0;i<10;i++)
    	 {
    		 for(j=0;j<10;j++)
    		 {
    			 cout<<arr[i][j]<<" ";
              }
    		 cout<<endl;
         }
      for(i=1;i<9;i++)
    	  for(j=1;j<9;j++)
    		  if(arr[i][j]==2)
    			  sum++;
      cout<<"找到迷宫出口需要"<<sum<<"步"<<endl;
    }

编译结果

 代码简析:

  1. 使用二维数组模拟迷宫地图,地图边界用1表示障碍挡板,障碍挡板自己赋值设置即可,其它位置(数值为0的位置为通路)。
  2. 写一个递归函数设置迷宫出口,这里设置的迷宫出口为(8,8)若到达arr[8][8]==2就结束递归。
  3. 自己设计一个走迷宫的策略(可以决定你的走迷宫的步数多少),我的策略是下右上左,到达一个位置先调用自身先判断下方的路是否为通,若通将此位置赋值为2,若不通判断它右方的位置是否为通,以此类推,若你设置的终点(i,j)arr[i][j]==2递归结束。
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
递归求解迷宫问题是一种常见的解决方法。其基本思路是:从起点开始,依次尝试向上、向下、向左、向右四个方向移动,如果能够移动,则继续递归下去,直到到达终点或者无法继续移动为止。 具体步骤如下: 1. 定义一个二维数组表示迷宫,用0表示墙,1表示路。 2. 定义一个递归函数,接收当前坐标和目标坐标作为参数。 3. 判断当前坐标是否为终点,如果是则返回true。 4. 判断当前坐标是否越界或者是墙,如果是则返回false。 5. 尝试向上、向下、向左、向右四个方向移动,如果能够移动,则继续递归下去。 6. 如果四个方向都无法移动,则返回false。 7. 在递归返回时,将当前坐标标记为已访问,避免重复访问。 8. 在主程序中调用递归函数,判断是否能够到达终点。 下面是一个示例代码: ``` #include <iostream> using namespace std; const int N = 10; int maze[N][N] = { {0,0,0,0,0,0,0,0,0,0}, {0,1,1,1,1,0,1,1,1,0}, {0,0,0,0,1,0,1,0,0,0}, {0,1,1,0,1,0,1,0,1,0}, {0,1,0,0,1,1,1,0,1,0}, {0,1,1,1,0,0,0,1,1,0}, {0,0,0,0,0,1,0,0,0,0}, {0,1,1,1,0,1,1,1,1,0}, {0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0} }; bool visited[N][N] = {false}; bool dfs(int x, int y, int tx, int ty) { if(x == tx && y == ty) return true; // 到达终点,返回true if(x < 0 || x >= N || y < 0 || y >= N || maze[x][y] == 0 || visited[x][y]) return false; // 越界或者是墙或者已经访问过,返回false visited[x][y] = true; // 标记已访问 if(dfs(x-1, y, tx, ty)) return true; // 尝试向上移动 if(dfs(x+1, y, tx, ty)) return true; // 尝试向下移动 if(dfs(x, y-1, tx, ty)) return true; // 尝试向左移动 if(dfs(x, y+1, tx, ty)) return true; // 尝试向右移动 visited[x][y] = false; // 递归返回时,将当前坐标标记为未访问 return false; // 四个方向都无法移动,返回false } int main() { int sx = 1, sy = 1, tx = 8, ty = 8; if(dfs(sx, sy, tx, ty)) cout << "可以到达终点" << endl; else cout << "无法到达终点" << endl; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值