SDUT 1269走迷宫(DFS+打印路径)

来源:互联网 发布:25001端口 编辑:程序博客网 时间:2024/04/28 08:36

走迷宫

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 41 1 0 01 1 1 10 1 1 01 1 0 11 1 1 11 15 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)

解题思路:

这道题就是一个简单的模板DFS,只要利用递归的思路不停的往下走就可以了,关于路径的打印,这里巧妙的利用了一个path数组,把x和y分别压进去,然后通过step来不断的调整path的值,在这个过程中同样需要应该有的回溯,才能输出随后的所有路径,其中step作为全局变量是非常重要的,以前一直不会输出路径,如今get了这个新技能,,,,

QAQ~

# include<cstdio># include<iostream># include<cstring>using namespace std;# define MAX 1000int m,n;int step;//$重要$,从起点到终点的所有路上上的节点的个数和int grid[16][16];int vis[16][16];int stx,sty;int edx,edy;int flag;int next[4][2] ={{-1,0},{0,-1},{0,1},{1,0}};struct node{    int x;    int y;}path[MAX];void output(){    for ( int i = 0;i < step-1;i++ )   printf("(%d,%d)->",path[i].x,path[i].y);printf("(%d,%d)\n",edx,edy);}void dfs( int x,int y ){    if ( x==edx && y==edy )    {        flag = 1;        output();        return;    }    for ( int i = 0;i < 4;i++ )    {        int n_x = x+next[i][0];        int n_y = y+next[i][1];       if( n_x>=1&&n_x<=m&&n_y>=1&&n_y<=n&&!vis[n_x][n_y]&&grid[n_x][n_y] )       {        path[step].x = n_x;        path[step++].y = n_y;        vis[n_x][n_y] = 1;        dfs( n_x,n_y );        vis[n_x][n_y] = 0;        step--;       }    }}int main(void){    while ( cin>>m>>n )    {        flag = 0;        memset( path,-1,sizeof(path) );        memset( vis,0,sizeof(vis) );        for ( int i = 1;i <= m;i++ )        {            for ( int j = 1;j <= n;j++ )            {                cin>>grid[i][j];            }        }        cin>>stx>>sty;        cin>>edx>>edy;        vis[stx][sty] = 1;        step = 0;        path[step].x = stx;        path[step++].y = sty;        dfs( stx,sty );        if ( !flag )        {            cout<<"-1"<<endl;        }    }    return 0;}


代码;

0 0
原创粉丝点击