当前位置: 首页 > news >正文

南阳483--Nightmare(Bfs)

Nightmare

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 4
描述
Ignatius had a nightmare last night. He found himself in a labyrinth with a time bomb on him. The labyrinth has an exit, Ignatius should get out of the labyrinth before the bomb explodes. The initial exploding time of the bomb is set to 6 minutes. To prevent the bomb from exploding by shake, Ignatius had to move slowly, that is to move from one area to the nearest area(that is, if Ignatius stands on (x,y) now, he could only on (x+1,y), (x-1,y), (x,y+1), or (x,y-1) in the next minute) takes him 1 minute. Some area in the labyrinth contains a Bomb-Reset-Equipment. They could reset the exploding time to 6 minutes.

Given the layout of the labyrinth and Ignatius' start position, please tell Ignatius whether he could get out of the labyrinth, if he could, output the minimum time that he has to use to find the exit of the labyrinth, else output -1.

Here are some rules:
1. We can assume the labyrinth is a 2 array.
2. Each minute, Ignatius could only get to one of the nearest area, and he should not walk out of the border, of course he could not walk on a wall, too.
3. If Ignatius get to the exit when the exploding time turns to 0, he can't get out of the labyrinth.
4. If Ignatius get to the area which contains Bomb-Rest-Equipment when the exploding time turns to 0, he can't use the equipment to reset the bomb.
5. A Bomb-Reset-Equipment can be used as many times as you wish, if it is needed, Ignatius can get to any areas in the labyrinth as many times as you wish.
6. The time to reset the exploding time can be ignore, in other words, if Ignatius get to an area which contain Bomb-Rest-Equipment, and the exploding time is larger than 0, the exploding time would be reset to 6.
输入
The input contains several test cases. The first line of the input is a single integer T which is the number of test cases. T test cases follow.
Each test case starts with two integers N and M(1<=N,Mm=8) which indicate the size of the labyrinth. Then N lines follow, each line contains M integers. The array indicates the layout of the labyrinth.
There are five integers which indicate the different type of area in the labyrinth:
0: The area is a wall, Ignatius should not walk on it.
1: The area contains nothing, Ignatius can walk on it.
2: Ignatius' start position, Ignatius starts his escape from this position.
3: The exit of the labyrinth, Ignatius' target position.
4: The area contains a Bomb-Reset-Equipment, Ignatius can delay the exploding time by walking to these areas.

输出
For each test case, if Ignatius can get out of the labyrinth, you should output the minimum time he needs, else you should just output -1.

样例输入
3 3 
2 1 1 
1 1 0 
1 1 3 
4 8 
2 1 1 0 1 1 1 0
1 0 4 1 1 0 4 1 
1 0 0 0 0 0 0 1 
1 1 1 4 1 1 1 3 
样例输出
-1
上传者

ACM_林志强

这个题题目要求不能标记,但是要注意是4的情况要标记为1;

#include <queue>
#include <cstdio> 
#include <cstring>
#include <iostream>
using  namespace std;
int map[ 10][ 10], ac[ 4][ 2] = { 010, - 1, - 1010};
struct Maze
{
     int x, y, step, eng;
} r, s, t;
int n, m; 
int Bfs( int a,  int b)
{
    r.x = a; r.y = b; r.step =  0; r.eng =  6;
    queue<Maze> Q;
    Q.push(r);
     while(!Q.empty())
    {
        s = Q.front(); Q.pop();
         for( int i =  0; i <  4; i++)
        {
            t.x = s.x + ac[i][ 0]; 
            t.y = s.y + ac[i][ 1];
            t.step = s.step +  1;
            t.eng = s.eng -  1;
             if(t.x >=  0 && t.x < n && t.y >=  0 && t.y < m && map[t.x][t.y] !=  0 && t.eng >  0)    
            {
                 if(map[t.x][t.y] ==  3)
                     return t.step;
                 if(map[t.x][t.y] ==  4)
                {
                    map[t.x][t.y] =  1;    /***********************/
                    t.eng =  6;
                }
                Q.push(t);
            }
        } 
    }
     return - 1;
}
int main()
{
     int T;
    scanf( " %d ", &T);
     while(T--)
    {
         int x, y, i, j;
        scanf( " %d %d ", &n, &m);
         for(i =  0; i < n; i++)    
             for(j =  0; j < m; j++)
            {
                scanf( " %d ", &map[i][j]);
                 if(map[i][j] ==  2)
                {
                    x = i; 
                    y = j;
                }
            }
        printf( " %d\n ", Bfs(x, y));
    }
     return  0;
}        

 

 

 

转载于:https://www.cnblogs.com/soTired/p/4778905.html

相关文章:

  • 系统启动流程
  • 8-30 文件查找命令find使用说明和练习
  • hdu1213 并查集
  • 如何禁用/恢复mac的spotlight
  • Jquery 控件
  • MATLAB — axis
  • druid 数据源 使用属性文件的一个坑
  • ASP Request.ServerVariables 参数集
  • [Linux]history 显示命令的运行时间
  • 《vi中的替换艺术》-linux命令五分钟系列之十一
  • Chromium Graphics: GPUclient的原理和实现分析之间的同步机制-Part I
  • 关联引用
  • 数据库的四种隔离级别
  • 跟马哥学linux (lesson 6)linux包管理程序rpm yum
  • 第八章:java常用类(一)
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • 78. Subsets
  • JAVA SE 6 GC调优笔记
  • java第三方包学习之lombok
  • Java-详解HashMap
  • Python_网络编程
  • vue.js框架原理浅析
  • windows-nginx-https-本地配置
  • 对象引论
  • 多线程 start 和 run 方法到底有什么区别?
  • 飞驰在Mesos的涡轮引擎上
  • 官方解决所有 npm 全局安装权限问题
  • 基于axios的vue插件,让http请求更简单
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 聊聊hikari连接池的leakDetectionThreshold
  • 前端工程化(Gulp、Webpack)-webpack
  • 手写双向链表LinkedList的几个常用功能
  • 算法---两个栈实现一个队列
  • 译自由幺半群
  • hi-nginx-1.3.4编译安装
  • 第二十章:异步和文件I/O.(二十三)
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​水经微图Web1.5.0版即将上线
  • (1)(1.9) MSP (version 4.2)
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (ZT)一个美国文科博士的YardLife
  • (补)B+树一些思想
  • (二)JAVA使用POI操作excel
  • (转)详解PHP处理密码的几种方式
  • .htaccess配置常用技巧
  • .Net mvc总结
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境