sdutoj 1269 走迷宫

题目链接:  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 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)

【思路】
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;
        }
    }
}


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值