三千里外欲封侯 2024-01-12 15:45 采纳率: 86.4%
浏览 3
已结题

输出所有迷宫路径,我的代码不能输出

代码在vs上运行,不能输出条数和路径,好像是因为没有成功调用Print函数
请大家看看哪里出了问题
题目描述:输入n,m表示行数和列数,@表示起点,*表示终点,#表示墙壁不能走,每一步都要按左上右下顺序搜索
输入样例:
5 3
.#.
#@.
*..
...
#.#
正常要输出七条路径


#include <iostream>
using namespace std;
int n, m;
int sx, sy, ex, ey;
char map[1000][1000];//标记数组
int footx[4] = { -1,0,1,0 };//方向数组
int footy[4] = { 0,-1,0,1 };
int lj[1000][2];//路径数组
int num = 0;//路径条数
bool Check(const int x,const int y)//检查下标是否合法
{
    if ((x >= 1) && (x <= m) && (y >= 1) && (y <= n))
        return 1;
    else 
        return 0;
}
void Print(int z)//打印路线
{
    cout << num << ": ";
    for (int i = 1; i < z; i++)
    {
        cout << lj[i][0] << lj[i][1] << "->";
    }
    cout << lj[z][0] << lj[z][1] << endl;
}
void dfs(int x,int y,int s)
{
    map[y][x] = '#';//保存现场
    lj[s][0] = x;
    lj[s][1] = y;
    if (x == ex && y == ey)//
    {
        num++;
        Print(s);
        return;
    }
    for (int i = 0; i < 4; i++)
    {
        int nx = x + footx[i];
        int ny = y + footy[i];
        if (Check(nx, ny) && map[ny][nx] == '.')
        {
            dfs(nx, ny, s + 1);
            map[ny][nx] = '.';//恢复现场
        }
    }
}
int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            cin >> map[i][j];
            if (map[i][j] == '@')//初始化起始坐标
            {
                sx = j;
                sy = i;
            }
            else if (map[i][j] == '*')//初始化终点坐标
            {
                ex = j;
                ey = i;
            }
        }
    }
    cout << "from " << sx << sy << " to " << ex << ey<<endl;
    dfs(sx, sy, 1);
    cout << num;
    return 0;
}
  • 写回答

3条回答 默认 最新

  • micthis 2024-01-12 16:23
    关注

    你只=='.'时才进入递归,难道不去终点吗?到不了终点能有输出吗?

    img

    #include <iostream>
    using namespace std;
    int n, m;
    int sx, sy, ex, ey;
    char map[1000][1000];//标记数组
    int footx[4] = { -1,0,1,0 };//方向数组
    int footy[4] = { 0,-1,0,1 };
    int lj[1000][2];//路径数组
    int num = 0;//路径条数
    bool Check(const int x,const int y)//检查下标是否合法
    {
        if ((x >= 1) && (x <= m) && (y >= 1) && (y <= n))
            return 1;
        else 
            return 0;
    }
    void Print(int z)//打印路线
    {
        cout << num << ": " << endl;
        for (int i = 1; i < z; i++)
        {
            cout << "(" << lj[i][0] << "," << lj[i][1] << ")->";
        }
        cout << "(" << lj[z][0] << "," << lj[z][1] << ")" << endl;
    }
    void dfs(int x,int y,int s)
    {
        map[y][x] = '#';//保存现场
        lj[s][0] = y;
        lj[s][1] = x;
        if (x == ex && y == ey)//
        {
            num++;
            Print(s);
            return;
        }
        for (int i = 0; i < 4; i++)
        {
            int nx = x + footx[i];
            int ny = y + footy[i];
            if (Check(nx, ny) && (map[ny][nx] == '.' || map[ny][nx] == '*'))
            {
                dfs(nx, ny, s + 1);
                map[ny][nx] = '.';//恢复现场
            }
        }
    }
    int main()
    {
        cin >> n >> m;
        for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= m; j++)
            {
                cin >> map[i][j];
                if (map[i][j] == '@')//初始化起始坐标
                {
                    sx = j;
                    sy = i;
                }
                else if (map[i][j] == '*')//初始化终点坐标
                {
                    ex = j;
                    ey = i;
                }
            }
        }
        cout << "from (" << sy << "," << sx << ") to (" << ey << "," << ex << ")" <<endl;
        dfs(sx, sy, 1);
        cout << num;
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 1月20日
  • 已采纳回答 1月12日
  • 创建了问题 1月12日

悬赏问题

  • ¥15 Opencv(C++)异常
  • ¥15 VScode上配置C语言环境
  • ¥15 汇编语言没有主程序吗?
  • ¥15 这个函数为什么会爆内存
  • ¥15 无法装系统,grub成了顽固拦路虎
  • ¥15 springboot aop 应用启动异常
  • ¥15 matlab有关债券凸性久期的代码
  • ¥15 lvgl v8.2定时器提前到来
  • ¥15 qtcp 发送数据时偶尔会遇到发送数据失败?用的MSVC编译器(标签-qt|关键词-tcp)
  • ¥15 cam_lidar_calibration报错