版权声明:长风原创 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. 小程序之setData特殊情况 三种情况的wx:if

    比如data{ “a”:{}, "b":{} } 你想完成这样的结构 //创建一个对象 var readyData={} //对象[key] =另一个对象 readyData[ke ...

  2. exists 的使用

    SELECT u.login_id, ( from mdp_user_login_info muli where muli.BIZ_SYS = 'admin' and u.login_id=muli. ...

  3. Oracle数据库三种备份方案

    Oracle数据库有三种标准的备份方法,它们分别是导出/导入(EXP/IMP).热备份和冷备份.导出备件是一种逻辑备份,冷备份和热备份是物理备份. 一. 导出/导入(Export/Import) 利用 ...

  4. TensorFlow随机值函数:tf.random_uniform

    tf.random_uniform 函数 random_uniform( shape, minval=0, maxval=None, dtype=tf.float32, seed=None, name ...

  5. C点滴成海----函数声明、函数定义、函数原型

    一.函数声明 1.格式 函数体去掉函数定义中的内容再加上分号,如下所示: 返回值类型 函数名( 类型 形参, 类型 形参… ); 返回值类型 函数名( 类型, 类型…); 2.特点 函数声明只是对编译 ...

  6. apache .htacess

    htaccess 详解   .htaccess是什么 .htaccess文件(或者"分布式配置文件")提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多 ...

  7. Charles安装及配置

    安装包及jar包下载地址: 1.下载Charles Proxy v4.2.dmg镜像文件,双击打开,将Charles拖拽到Applications中,Mac中打开一次Charles后关掉. 2.将下载 ...

  8. Python 特殊关系

    class Foo: def __init__(self): # 初始化操作 print("我是init, 我是老二") print("初始化操作. 在创建对象的时候自动 ...

  9. Deinstall卸载RAC之Oracle软件及数据库+GI集群软件

    Deinstall卸载Oracle软件及数据库+GI集群软件 1. 本篇文档应用场景: 需要安装新的ORACLE RAC产品,系统没有重装,需要对原环境中的RAC进行卸载: #本篇文档,在AIX 6. ...

  10. Python之路PythonThread,第一篇,进程1

    python3 进程1 多任务编程: 可以有效的利用计算机资源,同时执行多个任务, 进程:进程就是程序在计算机中一次执行的结果: 进程和程序的区别: 程序是一个静态文件的描述,不占用计算机的系统资源: ...