版权声明:长风原创 https://blog.csdn.net/u012846486/article/details/31032479

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.

例子输入
2
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
例子输出
4
-1
896378 长木

pid=483" rel="nofollow" style="text-decoration:none;color:rgb(55,119,188);">Nightmare

Accepted 4 308 C/C++ 06-15 21:03:39

896368

长木 Nightmare WrongAnswer -- -- C/C++ 06-15 20:54:57

896363

userid=%E9%95%BF%E6%9C%A8" rel="nofollow" style="text-decoration:none;color:rgb(55,119,188);">长木

Nightmare WrongAnswer -- -- C/C++ 06-15 20:49:37

896360

长木 Nightmare

runid=896360" rel="nofollow" style="text-decoration:none;color:rgb(55,119,188);">WrongAnswer

-- -- C/C++ 06-15 20:46:04

896339

userid=%E9%95%BF%E6%9C%A8" rel="nofollow" style="text-decoration:none;color:rgb(55,119,188);">长木

Nightmare

runid=896339" rel="nofollow" style="text-decoration:none;color:rgb(55,119,188);">WrongAnswer

-- -- C/C++ 06-15 20:14:06

runid=896333">

896333

长木

pid=483" rel="nofollow" style="text-decoration:none;color:rgb(55,119,188);">Nightmare

runid=896333" rel="nofollow" style="text-decoration:none;color:rgb(55,119,188);">WrongAnswer

-- -- C/C++ 06-15 20:02:33

896306

长木 Nightmare WrongAnswer -- -- C/C++ 06-15 19:06:14

说多泪啊(┬_┬),之前几次WA都是数组模拟队列时结果错用成了栈。。

AC:

#include <stdio.h>
#include <queue>
using std::queue;
int map[10][10], t, m, n, id;
int mov[][2] = {1, 0, -1, 0, 0, 1, 0, -1};
struct Node{
int x, y, steps, time;
} start;
queue<Node> Q; int check(int i, int j){
if(i < 0 || j < 0 || i >= m || j >= n)
return 0;
return map[i][j];
} int BFS(){
Node now, temp;
while(!Q.empty()){
now = Q.front();
Q.pop();
if(now.time == 1) continue; //cut
for(int i = 0; i < 4; ++i){
temp = now;
temp.x += mov[i][0];
temp.y += mov[i][1];
--temp.time; ++temp.steps;
if(check(temp.x, temp.y)){
if(map[temp.x][temp.y] == 3) return temp.steps;
else if(map[temp.x][temp.y] == 4){ //防止无限次充电
map[temp.x][temp.y] = 1;
temp.time = 6;
}
Q.push(temp);
}
}
}
return -1;
} int main(){
scanf("%d", &t);
while(t--){
scanf("%d%d", &m, &n);
start.steps = 0;
start.time = 6;
for(int i = 0; i < m; ++i)
for(int j = 0; j < n; ++j){
scanf("%d", &map[i][j]);
if(map[i][j] == 2){
start.x = i; start.y = j;
}
}
while(!Q.empty()) Q.pop();
Q.push(start);
printf("%d\n", BFS());
}
return 0;
}

WA:

#include <stdio.h>
int map[10][10], t, m, n, id;
int mov[][2] = {-1, 0, 0, 1, 1, 0, 0, -1};
struct Node{
int x, y, steps, time;
} Q[70], start; int check(int i, int j){
if(i < 0 || j < 0 || i >= m || j >= n)
return 0;
return map[i][j];
} int BFS(){
Node now, temp;
while(id){
now = Q[--id]; //这哪是出队啊。⊙﹏⊙b汗
if(map[now.x][now.y] == 3) return now.steps;
if(now.time == 1) continue; //cut
for(int i = 0; i < 4; ++i){
temp = now;
temp.x += mov[i][0];
temp.y += mov[i][1];
--temp.time; ++temp.steps;
if(check(temp.x, temp.y)){
if(map[temp.x][temp.y] == 4){ //防止无限次充电
map[temp.x][temp.y] = 1; //不能赋值为0,否则可能无限循环
temp.time = 6;
}
Q[id++] = temp;
}
}
}
return -1;
} int main(){
scanf("%d", &t);
while(t--){
scanf("%d%d", &m, &n);
start.steps = id = 0;
start.time = 6;
for(int i = 0; i < m; ++i)
for(int j = 0; j < n; ++j){
scanf("%d", &map[i][j]);
if(map[i][j] == 2){
start.x = i; start.y = j;
}
}
Q[id++] = start;
printf("%d\n", BFS());
}
return 0;
}

NYOJ 483 Nightmare 【广搜】+【无标记】的更多相关文章

  1. nyoj 523 双向广搜

    题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=523 #include<iostream> #include<cstd ...

  2. nyoj 483 Nightmare【bfs+优先队列】

    Nightmare 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 Ignatius had a nightmare last night. He found him ...

  3. HDU 1072 Nightmare (广搜)

    题目链接 Problem Description Ignatius had a nightmare last night. He found himself in a labyrinth with a ...

  4. Secret Milking Machine POJ - 2455 网络流(Dinic算法---广搜判断+深搜增广)+时间优化+二分

    题意: 第一行输入N M C ,表示从1到N有M条无向边,现在要从1走到N 走C次完全不同的路径,求最长边的最小值.下面M行是从a点到b点的距离. 建图: 题上说从两点之间可以有多条边,问的是从1~N ...

  5. 广搜 poj3278 poj1426 poj3126

    Catch That Cow Time Limit: 2000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u Ja ...

  6. nyoj 613 免费馅饼 广搜

    免费馅饼 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy ...

  7. nyoj 592 spiral grid(广搜)

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=592 解决以下问题后就方便用广搜解: 1.将数字坐标化,10000坐标为(0,0),这样就 ...

  8. nyoj 999——师傅又被妖怪抓走了——————【双广搜】

    师傅又被妖怪抓走了 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 话说唐僧复得了孙行者,师徒们一心同体,共诣西方.自宝象国救了公主,承君臣送出城西,沿路饥餐渴饮,悟 ...

  9. TOJ 2778 数据结构练习题――分油问题(广搜和哈希)

    描述 设有大小不等的三个无刻度的油桶,分别能盛满x,y,z公升油.初始时,第一个油桶盛满油,第二.三个油桶为空,在某一个油桶上分出targ公升油. 输入 输入包含多组测试数据.每组数据包含一行.分别x ...

随机推荐

  1. 第一篇 入门必备 (Android学习笔记)

    第一篇 入门必备 第1章 初识Android 第2章 搭建你的开发环境 第3章 创建第一个程序--HelloWorld 第4章 使用Android工具   ●Android之父 Android安迪·罗 ...

  2. Remove duplicates from array

    //Given a sorted array, remove the duplicates in place such that each element appear only // once an ...

  3. Cracking The Coding Interview 2.5

    这题的思想来自于http://hawstein.com/posts/2.5.html,重新实现了一下 用hash来记录循环的起点 //Given a circular linked list, imp ...

  4. 平行四边形 css实现

    首先将 display 设置为  inline-block 或block: 在应用skew(): transform:skewX(-45deg); 但是也会导致平行四边形内的文字倾斜如下 我们可以给文 ...

  5. js 冒泡事件阻止 父层事件影响子层

    当父层 与子层 有相同的事件时,但子层跟父层执行的内容却不一样时 为了 防止 父层事件对子层造成影响我们可以在子层的方法里做如下操作 function A (event){ event.stopPro ...

  6. FPGA复位的可靠性(转)

    FPGA复位的可靠性(同步复位和异步复位)  reference:http://www.eetop.cn/blog/html/17/743817-24442.html 一.特点: 同步复位:顾名思义, ...

  7. java Dom4j xml 写

    手动拼接xml 并返回 依赖包 <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</ ...

  8. 关于Java的特点之封装

    抽象 1.简单理解 我们在前面去定义一个类时候,实际上就是把一类事物的共有的属性和行为提取出来,形成一个物理模型(模版).这种研究问题的方法称为抽象. 封装--什么是封装 封装就是把抽象出来的数据和对 ...

  9. ios 拉伸图片和计算文字的大小

    一.拉伸图片 /** * 传入图片的名称,返回一张可拉伸不变形的图片 * * @param imageName 图片名称 * * @return 可拉伸图片 */ + (UIImage *)resiz ...

  10. python 爬虫数据时间转换格式

    from datetime import datetimea = '2018/9/18 10/10'print(datetime.strptime(a,'%Y/%m/%d %H/%M'))>&g ...