【提高】【回溯】【深搜】【递归】1411 - 迷宫的路径

哈哈嗨!代码来喽!

#include <bits/stdc++.h>
using namespace std;
int n,m,p;
char c[50][50];
bool a[50][50];
int r[50][3];
int fx[5]={0,0,1,0,-1};
int fy[5]={0,1,0,-1,0};
bool direct=false;
void print(int k)
{
    direct=true;
    p++;
    cout<<p<<":";
    for(int i=1;i<k;i++)
    {
        cout<<r[i][1]<<","<<r[i][2]<<"->";
    }
    cout<<r[k][1]<<","<<r[k][2]<<endl;
}
void dfs(int k)
{
    int tx,ty;
    for(int i=1;i<5;i++)
    {
        tx=r[k-1][1]+fx[i];
        ty=r[k-1][2]+fy[i];
        if(tx>0&&ty>0&&tx<=n&&ty<=m&&c[tx][ty]=='o'&&a[tx][ty]==false)
        {
            a[tx][ty]=true;
            r[k][1]=tx;
            r[k][2]=ty;
            if(tx==n&&ty==m)
            {
                print(k);
            }
            else
            {
                dfs(k+1);
            }
            a[tx][ty]=false;
        }
    }
}
int main()
{
    cin>>n>>m;
    getchar();
    r[1][1]=1;
    r[1][2]=1;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin>>c[i][j];
        }
    }
    a[1][1]=true;
    dfs(2);
    if(direct==false)
        cout<<"no"<<endl;
}

希望各位能点个赞+关注

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会为您解答这个问题。 迷宫问题是指在一个迷宫中,从起点到终点的路径问题。现在我们来看看如何用回溯来解决这个问题。 1. 定义状态空间:我们可以用一个二维数组来表示迷宫,其中 0 表示道路,1 表示障碍物,2 表示已经走过的路。 2. 定义决策空间:从当前位置开始,尝试向上、下、左、右四个方向移动,如果该位置合法,则继续往下进行,否则就回溯。 3. 定义终止条件:当到达终点时,就找到了一条路径。 4. 实现回溯: ```python def backtrack(maze, row, col, path): # 如果已经到达终点,则直接返回 if row == len(maze)-1 and col == len(maze[0])-1: print(path) return True # 尝试向上、下、左、右四个方向移动 directions = [(-1, 0), (1, 0), (0, -1), (0, 1)] for d in directions: n_row, n_col = row + d[0], col + d[1] # 判断当前位置是否合法 if 0 <= n_row < len(maze) and 0 <= n_col < len(maze[0]) and maze[n_row][n_col] == 0: # 如果合法,则标记为已经走过,并继续往下进行 maze[n_row][n_col] = 2 path.append((n_row, n_col)) if backtrack(maze, n_row, n_col, path): return True # 如果不合法,则回溯,将当前位置标记为道路,将当前位置从路径中删除 maze[n_row][n_col] = 0 path.pop() return False maze = [[0, 1, 0, 0, 0], [0, 1, 0, 1, 0], [0, 0, 0, 0, 0], [0, 1, 1, 1, 0], [0, 0, 0, 1, 0], [1, 1, 0, 0, 0]] backtrack(maze, 0, 0, [(0, 0)]) ``` 在上述代码中,我们使用一个二维数组 `maze` 来表示迷宫,其中 0 表示道路,1 表示障碍物,2 表示已经走过的路。在 `backtrack` 函数中,我们首先判断当前位置是否已经到达终点,如果是,则找到了一条路径;否则,我们尝试向上、下、左、右四个方向移动,找到合法的位置后,将其标记为已经走过,并继续往下进行。如果到达终点,则返回 True;否则就回溯,将当前位置标记为道路,将当前位置从路径中删除,继续尝试其他方向。在 `maze` 数组中,如果一个位置为 1 表示该位置为障碍物,不能通过;如果一个位置为 2,表示该位置已经走过,不能重复走。 以上就是用回溯来解决迷宫问题的过程。在实际应用中,我们可以根据具体问题的特点来定义状态空间、决策空间和终止条件,然后使用回溯来求解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值