m0_62719394 2022-06-06 19:14 采纳率: 100%
浏览 190
已结题

c语言迷宫多条路径求解

【问题描述】下图给出了一个迷宫的平面图,其中标记为黑色的为障碍,标记为白色的为可以通行的区域。迷宫的入口为左上角的黄色方格,出口为右下角的黄色方格。在迷宫中,只能从一个方格走到相邻的上、下、左、右四个方向之一。

找到迷宫从起点到终点的所有路径,输出路径条数。如果从起点到终点没有路径,则输出NO PASS!
注:所有迷宫的起点为左上角,终点为右下角。
【输入形式】依次输入n行由0和1构成的字符串,每行字符串长度相同,输入空串结束,其中1表示围墙,0表示可行路径。

img

  • 写回答

3条回答 默认 最新

  • 下坠丷 2022-06-06 22:46
    关注
    
    #include<iostream>
    #include<vector>
    #include<string>
    #include<cstring>
    using namespace std;
    //信息太少,先假设迷宫最多100层
    const int SIZE = 100;
    string  mg[SIZE];
    int book[SIZE][SIZE] = { 0 };
    int v[4][2] = { {0,1},{0,-1},{1,0},{-1,0} };
    
    void dfs(int m,int n,vector<char>& road,int i,int j, vector<vector<char>> &ans)
    {
        //到达终点
        if (i == m && j == n)
        {
            ans.push_back(road);
        }
        else
        {
            for (int k = 0; k < 4; k++)
            {
                //上下左右走,并标记走过的位置
                int vi = i + v[k][0];
                int vj = j + v[k][1];
                if (vi >= 0 && vi <= m && vj >= 0 && vj <= n && book[vi][vj] == 0&&mg[vi][vj]=='0')
                {
                    switch (k)
                    {
                    case 0:road.push_back('R'); break;
                    case 1:road.push_back('L'); break;
                    case 2:road.push_back('D'); break;
                    case 3:road.push_back('U'); break;
                    default:
                        break;
                    }
                    book[vi][vj] = 1;
                    dfs(m, n, road, vi, vj, ans);
                    //回溯
                    book[vi][vj] = 0;
                    road.pop_back();
                }
            }
        }
        
    }
    int main()
    {
        //读入地图
        int i;
        for (i = 0; i < SIZE; i++)
        {
            string temp;
            getline(cin, temp);
            if (temp.empty())
            {
                break;
            }
            mg[i] = temp;
        }
        vector<char> road;
        vector<vector<char>> ans;
        dfs(i-1, mg[0].length()-1, road, 0, 0,ans);
        if (ans.size())
        {
            cout << ans.size() << endl;
        }
        else
        {
            cout << "NO PASS!" << endl;
            return 0;
        }
        
        for (int i = 0; i < (int)ans.size(); i++)
        {
            for (int j = 0; j < (int)ans[i].size(); j++)
            {
                cout << ans[i][j];
            }
            cout << endl;
        }
    }
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 6月21日
  • 已采纳回答 6月13日
  • 修改了问题 6月6日
  • 创建了问题 6月6日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效