DFS之走迷宫

走迷宫
Time Limit: 1000 ms Memory Limit: 65536 KiB
Submit Statistic Discuss
Problem Description

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

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

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

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
Sample Output

(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)

题解:这是一道简单dp题……

代码:

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int dire[4][2] = {{0,-1},{-1,0},{0,1},{1,0}};
int vis[20][20];
int mp[20][20];
int h[20*20],lie[20*20];
int flag,step;
int x1,x2,y1,y2;
int m,n;
int out(int x,int y)
{
    if( x<1||x>m||y<1||y>n ) return 1;
    return 0;
}

void dfs(int x,int y)
{
    if(x==x2&&y==y2)
    {
        flag=1;
        for(int i=0;i<step;i++)
        {
            printf(i==0?"(%d,%d)":"->(%d,%d)",h[i],lie[i]);
        }
        cout<<endl;
        return;
    }
    for(int i=0;i<4;i++)
    {
        int xx=x+dire[i][0];
        int yy=y+dire[i][1];
        if(!out(xx,yy)&&!vis[xx][yy]&&mp[xx][yy])
        {
            h[step] = xx;
            lie[step] = yy;
            step++;
            vis[xx][yy] = 1;
            dfs(xx,yy);
            vis[xx][yy] = 0;
            step--;
        }
    }
}
int main()
{
    step=0;
    flag=0;

    cin>>m>>n;
    memset(vis,0,sizeof(vis));
    memset(mp,0,sizeof(mp));
    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=n;j++)
        {
            cin>>mp[i][j];
        }
    }

    cin>>x1>>y1>>x2>>y2;
     vis[x1][y1] = 1;
    h[0] = x1;
    lie[0] = y1;
    step++;
    dfs(x1, y1);
    if(flag==0 ) printf("-1\n");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42825221/article/details/81608430