• 走迷宫 SDUT1269 ACM算法设计


    走迷宫

    Time Limit: 1000MS Memory limit: 65536K

    题目描述

    有一个m*n格的迷宫(表示有m行、n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,输入这m*n个数据和起始点、结束点(起始点和结束点都是用两个数据来描述的,分别表示这个点的行号和列号)。现在要你编程找出所有可行的道路,要求所走的路中没有重复的点,走时只能是上下左右四个方向。如果一条路都不可行,则输出相应信息(用-1表示无路)。

    输入

    第一行是两个数m,n(1< m, n< 15),接下来是m行n列由1和0组成的数据,最后两行是起始点和结束点。

    输出

    所有可行的路径,输出时按照左上右下的顺序。描述一个点时用(x,y)的形式,除开始点外,其他的都要用“->”表示。如果没有一条可行的路则输出-1。

    示例输入

    5 4
    1 1 0 0
    1 1 1 1
    0 1 1 0
    1 1 0 1
    1 1 1 1
    1 1
    5 4

    示例输出

    (1,1)->(1,2)->(2,2)->(2,3)->(3,3)->(3,2)->(4,2)->(4,1)->(5,1)->(5,2)->(5,3)->(5,4)
    (1,1)->(1,2)->(2,2)->(2,3)->(3,3)->(3,2)->(4,2)->(5,2)->(5,3)->(5,4)
    (1,1)->(1,2)->(2,2)->(3,2)->(4,2)->(4,1)->(5,1)->(5,2)->(5,3)->(5,4)
    (1,1)->(1,2)->(2,2)->(3,2)->(4,2)->(5,2)->(5,3)->(5,4)
    (1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,2)->(4,2)->(4,1)->(5,1)->(5,2)->(5,3)->(5,4)
    (1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,2)->(4,2)->(5,2)->(5,3)->(5,4)
    (1,1)->(2,1)->(2,2)->(3,2)->(4,2)->(4,1)->(5,1)->(5,2)->(5,3)->(5,4)
    (1,1)->(2,1)->(2,2)->(3,2)->(4,2)->(5,2)->(5,3)->(5,4)

    深搜+模拟,注意当前递归栈的visited标志使用过后要重置回来,还有要注意题目中“左上右下的顺序”...

    #include <iostream>
    //#include <fstream>
    using namespace std;
    
    const int MAXN = 16;
    const int devide = 100;
    int maze[MAXN][MAXN];
    int queue[MAXN*MAXN];
    int visited[MAXN][MAXN];
    int m,n,r,s;
    int flag;
    
    void dfs(const int& x,const int& y,const int& depth)
    {
        if(x == r && y == s)
        {
            if(!flag) flag = 1;
            for(int i = 0;i < depth;i ++)
            {
                int u = queue[i];
                cout<<"("<<u/devide<<","<<u%devide<<")->";            
            }
            cout<<"("<<x<<","<<y<<")"<<endl;
        }
        else 
        {
            int p = queue[depth] / devide;
            int q = queue[depth] % devide;
            //左上右下
            if(q - 1 > 0 && maze[p][q-1] && !visited[p][q-1])
            {
                queue[depth + 1] = p * devide + q - 1;
                visited[p][q - 1] = 1;
                dfs(p,q - 1,depth + 1);
                visited[p][q - 1] = 0;
            }
            if(p - 1 > 0 && maze[p-1][q] && !visited[p-1][q])
            {
                queue[depth + 1] = (p - 1) * devide + q;
                visited[p-1][q] = 1;
                dfs(p-1,q,depth+1);
                visited[p-1][q] = 0;
            }
            if(q + 1 <= n && maze[p][q+1] && !visited[p][q+1])
            {
                queue[depth + 1] = p * devide + q + 1;
                visited[p][q+1] = 1;
                dfs(p,q+1,depth + 1);
                visited[p][q+1] = 0;
            }
            if(p + 1 <= m && maze[p+1][q] && !visited[p+1][q])
            {
                queue[depth + 1] = (p + 1) * devide + q;
                visited[p+1][q] = 1;
                dfs(p+1,q,depth+1);
                visited[p+1][q] = 0;
            }    
        }
    }
    
    int main()
    {
        //ifstream cin("in.txt");
        cin>>m>>n;
        for(int i = 1;i <= m;i ++) for(int j = 1;j <= n;j ++)
            cin>>maze[i][j];
    
        int x,y;
        cin>>x>>y>>r>>s;
        queue[0] = x * devide + y;
        visited[x][y] = 1;
        dfs(x,y,0);
    
        if(!flag)
            cout<<-1<<endl;
    
        return 0;
    }
    本博客所有博文,若无专门说明皆为原创,转载请注明作者和出处!
  • 相关阅读:
    Properties读取资源文件的四种方法
    如何成为一个C++高级程序员
    Linux定时任务设定
    Mysql之复制选项与监控
    GTID复制之二
    Mysql之多源复制
    MysqlDumpslow
    用Mysqlbinlog备份BinLog文件
    Mysql之mysqlbinlog使用
    Mysql之取消主从复制
  • 原文地址:https://www.cnblogs.com/ifinver/p/3031403.html
Copyright © 2020-2023  润新知