sdutoj 1269 走迷宫

来源:互联网 发布:泳衣品牌知乎 编辑:程序博客网 时间:2024/05/21 17:23

题目链接:  sdutoj 1269 走迷宫

/*题目描述有一个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*/#include <iostream>#include <string>#include <cstdio>#include <cstring>#include <cstdlib>#include <queue>#include <stack>using namespace std;const int SIZE = 102;//边界数组,四个方向,按照下、右、上、左的顺序int coordinate[4][2] = {0,-1, -1,0, 0,1, 1,0};stack<int> sx;stack<int> sy;stack<int> sxCopy;stack<int> syCopy;int mazeDfs[SIZE][SIZE];  //深搜用的迷宫int n;  //迷宫行数int m;  //迷宫列数int p, q;  //小鼠a的行号和列号int r, s;  //小鼠b的行号和列号int pathNumber;//深搜求最短路径条数void DFS(int x, int y);int main(){    scanf("%d%d", &n, &m);    {        for (int i=1; i<=n; i++)        {            for (int j=1; j<=m; j++)            {                scanf("%d", &mazeDfs[i][j]);            }        }        scanf("%d%d", &p, &q);  //起点坐标        scanf("%d%d", &r, &s);  //终点坐标        //输出所有的路径        pathNumber = 0;        sx.push(p);        sy.push(q);        mazeDfs[p][q] = 0;        DFS(p, q);        if (pathNumber == 0)        {            printf("-1\n");        }    }    return 0;}void DFS(int x, int y){    if ((x==r) && (y==s))  //找到一条最短路径    {        pathNumber++;        //输出路径        int j = sx.size();        for (int i=1; i<=j; i++)        {           sxCopy.push(sx.top());           sx.pop();           syCopy.push(sy.top());           sy.pop();        }        for (int i=1; i<j; i++)        {            printf("(%d,%d)->", sxCopy.top(), syCopy.top());            sx.push(sxCopy.top());            sxCopy.pop();            sy.push(syCopy.top());            syCopy.pop();        }        printf("(%d,%d)", sxCopy.top(), syCopy.top());        sx.push(sxCopy.top());        sxCopy.pop();        sy.push(syCopy.top());        syCopy.pop();        printf("\n");        return ;    }    for (int i=0; i<4; i++)    {        int xx, yy;        xx = x + coordinate[i][0];        yy = y + coordinate[i][1];        if ((xx>=1) && (xx<=n) && (yy>=1) && (yy<=m) && (mazeDfs[xx][yy]==1))        {            sx.push(xx);            sy.push(yy);            mazeDfs[xx][yy] = 0;            DFS(xx, yy);            //回溯            sx.pop();            sy.pop();            mazeDfs[xx][yy] = 1;        }    }}


 

 

原创粉丝点击