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

题意:

一只狗为了一根骨头,陷入一个迷宫当中,必须要在时间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;
}


你可能感兴趣的:(Algorithm,搜索,ACM,DFS,杭电)