杭电OJ(HDOJ)1010题:Tempter of the Bone(DFS,迷宫求解)

来源:互联网 发布:网络主播服装 编辑:程序博客网 时间:2024/06/05 06:59

题意:

一只狗为了一根骨头,陷入一个迷宫当中,必须要在时间T这一时刻逃到出口,走一步花一分钟,要刚好在T分钟到达出口。

给出三个整数:

n(1<n<7):表示迷宫格子行数;

m(1<m<7):表示迷宫格子列数;

t(0<n<50):表示迷宫格子行数。

n,m,t同时为0,GAME OVER!

入口是S,口是D,障碍物X。如果在T时刻到达D,输入YES,否则输出NO。

示例输入:

4 4 5

S.X.

..X.

..XD

....

3 4 5

S.X.

..X.

...D

0 0 0

示例输出:

NO

YES

解决方案:

一种迷宫求解,只可以上下左右行走,不可以左下,右下,左上,右上行走。图的深度优先搜索的算法,只是一个普通结点(非边缘点)有四个连接点。

注意:必须要在T时刻到达,不能小于等于T。红色标记代码

#include<iostream>using namespace std;int n;//迷宫行数int m;//迷宫列数int t;//规定的分钟数int flag[10][10];//用于标记格子是否被访问char map[10][10];//地图bool success;//标记出口是否找到void Visit(int sX,int sY,int count){    if(count>t)        return ;    else if(map[sX][sY]=='D'&&count==t)    {        success=true;        return;    }    else if(map[sX][sY]=='.'||map[sX][sY]=='S')    {        flag[sX][sY]=1;        if(sY+1<m&&flag[sX][sY+1]==0)  Visit(sX,sY+1,count+1);//向东(右)移动一格        if(sY-1>=0&&flag[sX][sY-1]==0)  Visit(sX,sY-1,count+1);//向西(左)移动一格        if(sX+1<n&&flag[sX+1][sY]==0)  Visit(sX+1,sY,count+1);//向南(下)移动一格        if(sX-1>=0&&flag[sX-1][sY]==0)  Visit(sX-1,sY,count+1);//向北(上)移动一格        flag[sX][sY]=0;    }}int main(){    int i,j,sX,sY;    while((cin>>n>>m>>t)&&(m+n+t))    {        for(i=0; i<n; i++)//输入迷宫            cin>>map[i];        success=false;        for(i=0; i<n; i++)            for(j=0; j<m; j++)            {                flag[i][j]=0;                if(map[i][j]=='S')                {                    sX=i;                    sY=j;                }            }        Visit(sX,sY,0);        if(success) cout<<"YES"<<endl;        else cout<<"NO"<<endl;    }    return 0;}


0 0