• TOJ 1005 Hero In Maze (深搜)


    描述

    500年前,Jesse是我国最卓越的剑客。他英俊潇洒,而且机智过人^_^。

    突然有一天,Jesse心爱的公主被魔王困在了一个巨大的迷宫中。Jesse听说这个消息已经是两天以后了,他知道公主在迷宫中还能坚持T天,他急忙赶到迷宫,开始到处寻找公主的下落。

    时间一点一点的过去,Jesse还是无法找到公主。最后当他找到公主的时候,美丽的公主已经死了。从此Jesse郁郁寡欢,茶饭不思,一年后追随公主而去了。T_T

    500年后的今天,Jesse托梦给你,希望你帮他判断一下当年他是否有机会在给定的时间内找到公主。

    他会为你提供迷宫的地图以及所剩的时间T。请你判断他是否能救出心爱的公主。

    输入

    题目包括多组测试数据。

    每组测试数据以三个整数N,M,T(0<n, m≤20, t>0)开头,分别代表迷宫的长和高,以及公主能坚持的天数。

    紧接着有M行,N列字符,由".","*","P","S"组成。其中

    "." 代表能够行走的空地。

    "*" 代表墙壁,Jesse不能从此通过。

    "P" 是公主所在的位置。

    "S" 是Jesse的起始位置。

    每个时间段里Jesse只能选择“上、下、左、右”任意一方向走一步。

    输入以0 0 0结束。

    输出

    如果能在规定时间内救出公主输出“YES”,否则输出“NO”。

    样例输入

    4 4 10

    ....

    ....

    ....

    S**P

    0 0 0

    样例输出

    YES

    分析:

    s1,自定义一个队列的数据结构来存放结点的信息。

    s2,创建并初始化好地图和标记数组。

    s3,先得到王子的位置,将它放入队列里。

    s4,当队列不为空的时候,让第一个元素出队作为当前位置,在当前位置的上下左右进行寻找公主。如果遇到公主就返回当前位置的标记,如果遇到的不是围墙也不是已经标记过的结点就将其放入队列并且给予标记。

    s5,重复第4步,直到找到公主或者队列为空为止。

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    using namespace std;
    int dir[4][2] = {1,0,-1,0,0,1,0,-1};
    char map[1000][1000];//地图
    int vis[1000][1000];//用来标记是否走过
    int sx,sy,px,py,t,n,m,flag,f;
    struct step
    {
        int x,y,s;
    };
    
    void bfs()
    {
        queue<step> q;
        step p;
        p.x = sx;
        p.y = sy;
        p.s = 0;
        vis[sx][sy] = 1;
        q.push(p);//起点入队
    
        while(!q.empty()) //起点入队后开始循环
        {
            step p = q.front();
    
            if(p.x==px && p.y==py)
            {
                flag =1;
                if(p.s<=t)
                {
                    f=1;
                    printf("YES
    ");
                    break;
                }
            }
    
            step v;
            for(int i=0 ; i<4 ; i++)
            {
                v.x = p.x + dir[i][0];
                v.y = p.y + dir[i][1];
                if(map[v.x][v.y]=='*') //路不通(有墙壁)
                {
                    continue;
                }
                if(v.x>=0 && v.x<n && v.y>=0 && v.y<m && vis[v.x][v.y]==0)
                {
                    v.s = p.s + 1;
                    q.push(v);
                    vis[v.x][v.y] = 1;
                }
            }
            q.pop();
        }
        if(flag==0||f==0)  //1.flag==0说明无法到达2.flag!=0,f==0,说明可以到达但是时间不够
        {
            printf("NO
    ");
        }
    }
    
    int main()
    {
        while(cin>>m>>n>>t)
        {
            if(n==0&&m==0&&t==0)
            {
                break;
            }
            memset(map,0,sizeof(map));
            memset(vis,0,sizeof(vis));
            for(int i=0 ; i<n ; i++)
            {
                for(int j=0 ; j<m ; j++)
                {
                    cin>>map[i][j];
                    if(map[i][j]=='S')
                    {
                        sx = i;
                        sy = j;
                    }
                    if(map[i][j]=='P')
                    {
                        px = i;
                        py = j;
                    }
                }
            }
            flag = 0;
            f = 0;
            bfs();
        }
    }
  • 相关阅读:
    JQuery autocomplete选中某项后触发事件
    Javascript类的写法
    windows2003里的数据库没被访问到
    SQL SERVER 2008 评估期已过,哪位大哥有解决方法?
    js对json增删改查操作
    javascript 谁才是initialize方法
    JavaScript的写类方式(1)
    我所收集的googlemap 应用实例
    经典的正则表达式工具Regulator使用教程(图文)
    Map的使用
  • 原文地址:https://www.cnblogs.com/cmmdc/p/6768202.html
Copyright © 2020-2023  润新知