• ACM-Hero In Maze


                                                   Hero In Maze

    时间限制(普通/Java):1000MS/10000MS          运行内存限制:65536KByte

    描述

    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
     
    题解:bfs搜索
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include <queue>
    using namespace std;
    int dx[4] = {-1,0,1,0};//左上右下4个方向进行搜索
    int dy[4] = {0,1,0,-1};
    char map[25][25];//地图
    int dp[25][25];//访问标记
    int n,m,t,X,Y;
    struct Point{
      int x,y;
      int time;
    };
    int bfs(int x, int y){
       int i;
       queue<Point> q;
       Point start, now, next;
       start.x = x;
       start.y = y;
       start.time = 0;
       q.push(start);
       while(!q.empty()){
           now = q.front();
           q.pop();
           if(now.x == X && now.y == Y){
              return now.time;
           }
           for(i=0; i<4; i++){
              next.x = now.x+dx[i];
              next.y = now.y+dy[i];
              //不能超过范围和已经访问过的点
              if(next.x >=0 && next.x<m && next.y>=0 && next.y<n && !dp[next.x][next.y]){
                  dp[next.x][next.y] = 1;
                  next.time = now.time +1;
                  q.push(next);
              }
           }
        }
        return 0;
    }
    int main()
    {
      int i,j,x,y;
      while(~scanf("%d%d%d",&n,&m,&t) && (n||m||t)){
           memset(dp,0,sizeof dp);//设置为0
            for(i=0; i<m; i++){
                    cin>>map[i];
                }
            for( i=0; i<m; i++){
             for( j=0; j<n; j++){
                    if(map[i][j] == 'S'){//开始点
                        dp[i][j] = 1;
                        x =i;
                        y = j;
                    }else if(map[i][j] == 'P'){//结束点
                            X = i;
                            Y = j;
                    }else if(map[i][j] == '*'){
                        dp[i][j] = 1;//墙壁不能访问的点
                    }
                 }
            }
            int min = bfs(x,y);
            if(min == 0){
                cout<<"NO"<<endl;
                continue;
            }
            if(min <= t){
              cout<<"YES"<<endl;
            }else{
                cout<<"NO"<<endl;
            }
        }
     return 0;
    }
    View Code
  • 相关阅读:
    Oracle ref cursor和sys_refcursor
    一些命令可以帮您了解Linux 操作系统用户信息
    Linux 6上使用UDEV绑定共享存储
    Oracle VirtualBox 问题汇总
    Linux 常用操作
    CentOS 7 运行级别切换
    Oracle 更新Opatch、打补丁
    django rest framework restful 规范
    CBV FBV rest framework
    CRM
  • 原文地址:https://www.cnblogs.com/lzeffort/p/6380334.html
Copyright © 2020-2023  润新知