YTU 3006: 迷宫问题(栈与队列)

3006: 迷宫问题(栈与队列)

时间限制: 1 Sec   内存限制: 128 MB
提交: 3   解决: 1

题目描述

编写一个求解迷宫问题的程序,要求输出迷宫的所有路径,并求最短路径长度及最短路径。

 

规定:

S:迷宫的入口

D:迷宫的出口

X:障碍物,无法从这里通过

*:空地

 

搜索顺序优先度:↑、→、↓、←

输入

输入的第一行包含一个数字n,接下来的n行输入一个n*n的迷宫地图。

输出

输出迷宫的所有路径,每一种路径占一行。最后输出所有路径中最长路径和最短路径的长度。

样例输入

6
XXXXXX
XS**XX
X*X**X
X***XX
XX**DX
XXXXXX

样例输出

→→↓↓↓→
→→↓↓←↓→→
↓↓→→↓→
↓↓→↓→→
8 6

提示

1、使用栈求解


2、搜索顺序优先度:↑、→、↓、←


3、若没有路径可以走出迷宫,则输出0 0


迷失在幽谷中的鸟儿,独自飞翔在这偌大的天地间,却不知自己该飞往何方……

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#define SizeMax 105
using namespace std;
int n,maxx=0,minn=0xffff;
char a[10][10];
typedef struct
{
    char data[SizeMax][5];
    int top;
} SqStack;
SqStack *s=(SqStack*)malloc(sizeof(SqStack));
void push(SqStack *&s,string k)                 //入栈
{
    char *e=(char*)k.data();                    //将string类型转换成char*
    if(s->top==SizeMax-1)return;
    s->top++;
    strcpy(s->data[s->top],e);                  //入栈
}
void print(SqStack *s)                          //输出
{
    for(int i=0; i<=s->top; i++)
        cout<<s->data[i];
    cout<<endl;
}
void dfs(int x,int y,int k)                     //深度优先扫描
{
    if(a[x][y]=='D')
    {
        maxx=maxx<k?k:maxx;                     //最大值
        minn=minn>k?k:minn;                     //最小值
        print(s);
        return;
    }a[x][y]='X';                               //走过的路用‘X’填充,防止出现重复路线
    for(int i=0; i<4; i++)
    {
        if(i==0){if(a[x-1][y]!='X'&&x-1>=0)push(s,"↑"),dfs(x-1,y,k+1),s->top--;}        //向上
        else if(i==1){if(a[x][y+1]!='X'&&y+1<n)push(s,"→"),dfs(x,y+1,k+1),s->top--;}    //向右
        else if(i==2){if(a[x+1][y]!='X'&&x+1<n)push(s,"↓"),dfs(x+1,y,k+1),s->top--;}    //向下
        else if(i==3){if(a[x][y-1]!='X'&&y-1>=0)push(s,"←"),dfs(x,y-1,k+1),s->top--;}   //向左
    }a[x][y]='*';                               //回溯结束后解开被填充的路口
}
int main()
{
    cin>>n;
    for(int i=0; i<n; i++)
        scanf("%s%*c",a[i]);
    s->top=-1;
    int x,y;
    for(int i=0; i<n; i++)
        for(int j=0; j<n; j++)
            if(a[i][j]=='S')                    //确定‘S’的位置
            {
                x=i,y=j;
                goto end1;
            }
end1:
    dfs(x,y,0);
    if(maxx==0)minn=0;
    printf("%d %d\n",maxx,minn);
    return 0;
}

附上后台一组测试数据大笑

/*
10
XX*S***XXX
X***X*****
XX****XX**
***X****X*
*X***X***X
***X***XX*
*****X**X*
X*X*X**X**
X***D*XX*X
X*X*X****X

→→→↓←↓↓→→↓←↓↓↓←↓←
→→→↓←↓↓→→↓←↓←←↑↑↑←↑←↓↓↓↓↓→↓↓→
→→→↓←↓↓→→↓←↓←←↑↑↑←↑←↓↓↓↓↓←↓↓→→→
→→→↓←↓↓→→↓←↓←←↑↑↑←↑←↓↓↓↓←↓→→↓↓→
→→→↓←↓↓→→↓←↓←←↑↑↑←↑←↓↓↓↓←↓↓↓→→→
→→→↓←↓↓→→↓←↓←←↑↑↑←↑←↓↓↓↓←←↓→→→↓↓→
→→→↓←↓↓→→↓←↓←←↑↑↑←↑←↓↓↓↓←←↓→↓↓→→→
→→→↓←↓↓→→↓←↓←←↑↑↑←↑←↓↓←←↓↓→→↓→↓↓→
→→→↓←↓↓→→↓←↓←←↑↑↑←↑←↓↓←←↓↓→→↓←↓↓→→→
→→→↓←↓↓→→↓←↓←←↑↑↑←↑←↓↓←←↓↓→↓→→↓↓→
→→→↓←↓↓→→↓←↓←←↑↑↑←↑←↓↓←←↓↓→↓↓↓→→→
→→→↓←↓↓→→↓←↓←←↑↑↑←↑←↓↓←←↓↓↓→↑→↓→↓↓→
→→→↓←↓↓→→↓←↓←←↑↑↑←↑←↓↓←←↓↓↓→→→↓↓→
→→→↓←↓↓→→↓←↓←←↑↑↑←↑←↓↓←←↓↓↓→↓↓→→→
→→→↓←↓↓→→↓←↓←←↑↑↑←←↓↓↓↓→↓↓→
→→→↓←↓↓→→↓←↓←←↑↑↑←←↓↓↓↓←↓↓→→→
→→→↓←↓↓→→↓←↓←←↑↑↑←←↓↓↓←↓→→↓↓→
→→→↓←↓↓→→↓←↓←←↑↑↑←←↓↓↓←↓↓↓→→→
→→→↓←↓↓→→↓←↓←←↑↑↑←←↓↓↓←←↓→→→↓↓→
→→→↓←↓↓→→↓←↓←←↑↑↑←←↓↓↓←←↓→↓↓→→→
→→→↓←↓↓→→↓←↓←←↑↑↑←←↓←←↓↓→→↓→↓↓→
→→→↓←↓↓→→↓←↓←←↑↑↑←←↓←←↓↓→→↓←↓↓→→→
→→→↓←↓↓→→↓←↓←←↑↑↑←←↓←←↓↓→↓→→↓↓→
→→→↓←↓↓→→↓←↓←←↑↑↑←←↓←←↓↓→↓↓↓→→→
→→→↓←↓↓→→↓←↓←←↑↑↑←←↓←←↓↓↓→↑→↓→↓↓→
→→→↓←↓↓→→↓←↓←←↑↑↑←←↓←←↓↓↓→→→↓↓→
→→→↓←↓↓→→↓←↓←←↑↑↑←←↓←←↓↓↓→↓↓→→→
→→→↓←↓↓→→↓←↓←←↑←←↑←←↓↓→→↓→↓↓→
→→→↓←↓↓→→↓←↓←←↑←←↑←←↓↓→→↓←↓↓→→→
→→→↓←↓↓→→↓←↓←←↑←←↑←←↓↓→↓→→↓↓→
→→→↓←↓↓→→↓←↓←←↑←←↑←←↓↓→↓↓↓→→→
→→→↓←↓↓→→↓←↓←←↑←←↑←←↓↓↓→↑→↓→↓↓→
→→→↓←↓↓→→↓←↓←←↑←←↑←←↓↓↓→→→↓↓→
→→→↓←↓↓→→↓←↓←←↑←←↑←←↓↓↓→↓↓→→→
→→→↓←↓↓→→↓←↓←←↑←←↓↓→↓↓→
→→→↓←↓↓→→↓←↓←←↑←←↓↓←↓↓→→→
→→→↓←↓↓→→↓←↓←←↑←←↓←↓→→↓↓→
→→→↓←↓↓→→↓←↓←←↑←←↓←↓↓↓→→→
→→→↓←↓↓→→↓←↓←←↑←←↓←←↓→→→↓↓→
→→→↓←↓↓→→↓←↓←←↑←←↓←←↓→↓↓→→→
→→→↓←↓↓→→↓←↓←←↓←↓↓→
→→→↓←↓↓→→↓←↓←←↓←←↑↑↑←←↓↓→↓↓↓→→→
→→→↓←↓↓→→↓←↓←←↓←←↑↑↑←←↓↓↓→↓↓→→→
→→→↓←↓↓→→↓←↓←←↓←←↑↑→→↑↑←↑←↓↓←←↓↓→↓↓↓→→→
→→→↓←↓↓→→↓←↓←←↓←←↑↑→→↑↑←↑←↓↓←←↓↓↓→↓↓→→→
→→→↓←↓↓→→↓←↓←←↓←←↑↑→→↑↑←←↓←←↓↓→↓↓↓→→→
→→→↓←↓↓→→↓←↓←←↓←←↑↑→→↑↑←←↓←←↓↓↓→↓↓→→→
→→→↓←↓↓→→↓←↓←←↓←←↑←↓↓↓→→→
→→→↓←↓↓→→↓←↓←←↓←←↑←←↓→↓↓→→→
→→→↓←↓↓→→↓←↓←←↓←←←↓↓→→→
→→→↓←↓↓→↓↓↓↓←↓←
→→→↓←↓↓→↓↓←←↑↑↑←↑←↓↓↓↓↓→↓↓→
→→→↓←↓↓→↓↓←←↑↑↑←↑←↓↓↓↓↓←↓↓→→→
→→→↓←↓↓→↓↓←←↑↑↑←↑←↓↓↓↓←↓→→↓↓→
→→→↓←↓↓→↓↓←←↑↑↑←↑←↓↓↓↓←↓↓↓→→→
→→→↓←↓↓→↓↓←←↑↑↑←↑←↓↓↓↓←←↓→→→↓↓→
→→→↓←↓↓→↓↓←←↑↑↑←↑←↓↓↓↓←←↓→↓↓→→→
→→→↓←↓↓→↓↓←←↑↑↑←↑←↓↓←←↓↓→→↓→↓↓→
→→→↓←↓↓→↓↓←←↑↑↑←↑←↓↓←←↓↓→→↓←↓↓→→→
→→→↓←↓↓→↓↓←←↑↑↑←↑←↓↓←←↓↓→↓→→↓↓→
→→→↓←↓↓→↓↓←←↑↑↑←↑←↓↓←←↓↓→↓↓↓→→→
→→→↓←↓↓→↓↓←←↑↑↑←↑←↓↓←←↓↓↓→↑→↓→↓↓→
→→→↓←↓↓→↓↓←←↑↑↑←↑←↓↓←←↓↓↓→→→↓↓→
→→→↓←↓↓→↓↓←←↑↑↑←↑←↓↓←←↓↓↓→↓↓→→→
→→→↓←↓↓→↓↓←←↑↑↑←←↓↓↓↓→↓↓→
→→→↓←↓↓→↓↓←←↑↑↑←←↓↓↓↓←↓↓→→→
→→→↓←↓↓→↓↓←←↑↑↑←←↓↓↓←↓→→↓↓→
→→→↓←↓↓→↓↓←←↑↑↑←←↓↓↓←↓↓↓→→→
→→→↓←↓↓→↓↓←←↑↑↑←←↓↓↓←←↓→→→↓↓→
→→→↓←↓↓→↓↓←←↑↑↑←←↓↓↓←←↓→↓↓→→→
→→→↓←↓↓→↓↓←←↑↑↑←←↓←←↓↓→→↓→↓↓→
→→→↓←↓↓→↓↓←←↑↑↑←←↓←←↓↓→→↓←↓↓→→→
→→→↓←↓↓→↓↓←←↑↑↑←←↓←←↓↓→↓→→↓↓→
→→→↓←↓↓→↓↓←←↑↑↑←←↓←←↓↓→↓↓↓→→→
→→→↓←↓↓→↓↓←←↑↑↑←←↓←←↓↓↓→↑→↓→↓↓→
→→→↓←↓↓→↓↓←←↑↑↑←←↓←←↓↓↓→→→↓↓→
→→→↓←↓↓→↓↓←←↑↑↑←←↓←←↓↓↓→↓↓→→→
→→→↓←↓↓→↓↓←←↑←←↑←←↓↓→→↓→↓↓→
→→→↓←↓↓→↓↓←←↑←←↑←←↓↓→→↓←↓↓→→→
→→→↓←↓↓→↓↓←←↑←←↑←←↓↓→↓→→↓↓→
→→→↓←↓↓→↓↓←←↑←←↑←←↓↓→↓↓↓→→→
→→→↓←↓↓→↓↓←←↑←←↑←←↓↓↓→↑→↓→↓↓→
→→→↓←↓↓→↓↓←←↑←←↑←←↓↓↓→→→↓↓→
→→→↓←↓↓→↓↓←←↑←←↑←←↓↓↓→↓↓→→→
→→→↓←↓↓→↓↓←←↑←←↓↓→↓↓→
→→→↓←↓↓→↓↓←←↑←←↓↓←↓↓→→→
→→→↓←↓↓→↓↓←←↑←←↓←↓→→↓↓→
→→→↓←↓↓→↓↓←←↑←←↓←↓↓↓→→→
→→→↓←↓↓→↓↓←←↑←←↓←←↓→→→↓↓→
→→→↓←↓↓→↓↓←←↑←←↓←←↓→↓↓→→→
→→→↓←↓↓→↓↓←←↓←↓↓→
→→→↓←↓↓→↓↓←←↓←←↑↑↑←←↓↓→↓↓↓→→→
→→→↓←↓↓→↓↓←←↓←←↑↑↑←←↓↓↓→↓↓→→→
→→→↓←↓↓→↓↓←←↓←←↑↑→→↑↑←↑←↓↓←←↓↓→↓↓↓→→→
→→→↓←↓↓→↓↓←←↓←←↑↑→→↑↑←↑←↓↓←←↓↓↓→↓↓→→→
→→→↓←↓↓→↓↓←←↓←←↑↑→→↑↑←←↓←←↓↓→↓↓↓→→→
→→→↓←↓↓→↓↓←←↓←←↑↑→→↑↑←←↓←←↓↓↓→↓↓→→→
→→→↓←↓↓→↓↓←←↓←←↑←↓↓↓→→→
→→→↓←↓↓→↓↓←←↓←←↑←←↓→↓↓→→→
→→→↓←↓↓→↓↓←←↓←←←↓↓→→→
→→→↓←↓↓←↑←↑←↓↓↓→→↓→→↓↓←↓←
→→→↓←↓↓←↑←↑←↓↓↓→→↓↓←↓↓→
→→→↓←↓↓←↑←↑←↓↓↓→→↓↓←←↑←↓↓↓→→→
→→→↓←↓↓←↑←↑←↓↓↓→→↓↓←←↑←←↓→↓↓→→→
→→→↓←↓↓←↑←↑←↓↓↓→→↓↓←←←↓↓→→→
→→→↓←↓↓←↑←↑←↓↓↓↓↓→→↑→→↓↓←↓←
→→→↓←↓↓←↑←↑←↓↓↓↓↓→↓↓→
→→→↓←↓↓←↑←↑←↓↓↓↓↓←↓↓→→↑↑→↑→→↓↓←↓←
→→→↓←↓↓←↑←↑←↓↓↓↓↓←↓↓→→→
→→→↓←↓↓←↑←↑←↓↓↓↓←↓→→→↑→→↓↓←↓←
→→→↓←↓↓←↑←↑←↓↓↓↓←↓→→↓↓→
→→→↓←↓↓←↑←↑←↓↓↓↓←↓↓↓→→↑↑→↑→→↓↓←↓←
→→→↓←↓↓←↑←↑←↓↓↓↓←↓↓↓→→→
→→→↓←↓↓←↑←↑←↓↓↓↓←←↓→→→→↑→→↓↓←↓←
→→→↓←↓↓←↑←↑←↓↓↓↓←←↓→→→↓↓→
→→→↓←↓↓←↑←↑←↓↓↓↓←←↓→↓↓→→↑↑→↑→→↓↓←↓←
→→→↓←↓↓←↑←↑←↓↓↓↓←←↓→↓↓→→→
→→→↓←↓↓←↑←↑←↓↓←←↓↓→→↑→→↓→→↓↓←↓←
→→→↓←↓↓←↑←↑←↓↓←←↓↓→→↑→→↓↓←↓↓→
→→→↓←↓↓←↑←↑←↓↓←←↓↓→→↑→→↓↓←←←↓↓→→→
→→→↓←↓↓←↑←↑←↓↓←←↓↓→→↓→→↑→→↓↓←↓←
→→→↓←↓↓←↑←↑←↓↓←←↓↓→→↓→↓↓→
→→→↓←↓↓←↑←↑←↓↓←←↓↓→→↓←↓↓→→↑↑→↑→→↓↓←↓←
→→→↓←↓↓←↑←↑←↓↓←←↓↓→→↓←↓↓→→→
→→→↓←↓↓←↑←↑←↓↓←←↓↓→↓→↑↑→→↓→→↓↓←↓←
→→→↓←↓↓←↑←↑←↓↓←←↓↓→↓→↑↑→→↓↓←↓↓→
→→→↓←↓↓←↑←↑←↓↓←←↓↓→↓→→→↑→→↓↓←↓←
→→→↓←↓↓←↑←↑←↓↓←←↓↓→↓→→↓↓→
→→→↓←↓↓←↑←↑←↓↓←←↓
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值