sicily 1215. 脱离地牢

2023-10-25 13:40
文章标签 脱离 sicily 1215 地牢

本文主要是介绍sicily 1215. 脱离地牢,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Description

在一个神秘的国度里,年轻的王子Paris与美丽的公主Helen在一起过着幸福的生活。他们都随身带有一块带磁性的阴阳魔法石,身居地狱的魔王Satan早就想得到这两块石头了,只要把它们熔化,Satan就能吸收其精华大增自己的魔力。于是有一天他趁二人不留意,把他们带到了自己的地牢,分别困在了不同的地方。然后Satan念起了咒语,准备炼狱,界时二人都将葬身于这地牢里。

危险!Paris与Helen都知道了Satan的意图,他们要怎样才能打败魔王,脱离地牢呢?Paris想起了父王临终前留给他的备忘本,原来他早已料到了Satan的野心,他告诉Paris只要把两块魔法石合在一起,念出咒语,它们便会放出无限的光亮,杀死魔王,脱离地牢,而且本子上还附下了地牢的地图,Paris从中了解到了Helen的位置所在。于是他决定首先要找到Helen,但是他发现这个地牢很奇怪,它会增强二人魔法石所带磁力的大小,而且会改变磁力的方向。这就是说,每当Pairs向南走一步,Helen有可能会被石头吸引向北走一步。而这个地狱布满了岩石与熔浆,Pairs必须十分小心,不仅他不能走到岩石或熔浆上,而且由于他行走一步,Helen的位置也会改变,如果Helen碰到岩石上,那么她将停留在原地,但如果Helen移动到了熔浆上,那么她将死去,Paris就找不到她了。

Pairs仔细分析了地图,他找出了一条最快的行走方案,最终与Helen相聚。他们一起念出了咒语"@^&#……%@%&$",轰隆一声,地牢塌陷了,他们又重见光明……

Input
输入数据第一行为两个整数n,m(3<=n,m<=20),表示地牢的大小,n行m列。接下来n行,每行m个字符,描述了地牢的地图,"."代表通路,"#"代表岩石,"!"代表熔浆。输入保证地牢是封闭的,即四周均是均是岩石或熔浆。接下来一行有四个字符"N"(北),"S"(南),"W"(西),"E"(东)的排列,表示Paris分别向NSWE四个方向走时Helen受磁石磁力影响的移动方向。
Output
输出文件只有一行,如果Paris能找到Helen,输出一整数d,为Paris最少需要行走的步数;如果Paris在255步之后仍找不到Helen,则输出"Impossible"。注意相遇是指Paris与Helen最终到达同一个格子,或者二人在相邻两格移动后碰在了一起,而后者的步数算他们移动后的步数。
Sample Input
 Copy sample input to clipboard 
5 5
#####
#H..#
#.!.#
#.#P#
#####
WNSE
Sample Output
5解释:Paris行走方案为NNWWS,每步过后Helen位置在(2,2), (2,2), (3,2), (4,2), (3,2)。

 

分析:因为要找的是最短步数,所以用 bfs,二人在相邻两格移动后碰在了一起的时候,步数算他们移动后的步数。注意 H 不能移动的情况当 H 和 P 两者的状态和前面某一状态相同时,说明循环了,也就是要保存两者的状态,注意这里的状态由 H 和 P 两者的位置决定,而不是由其中某一个决定。
#include <iostream>
#include <map>
#include <queue>
#include <cstring>using namespace std;char pict[20][20];
bool visited[20][20][20][20];struct Node {Node(int Px_ = 0, int Py_ = 0, int Hx_ = 0, int Hy_ = 0, int step_ = 0):Px(Px_), Py(Py_), Hx(Hx_), Hy(Hy_), step(step_) { }int Px, Py, Hx, Hy;int step;
};struct Location {Location(int x_ = 0, int y_ = 0) : x(x_), y(y_) { }int x, y;
};Location P, H;
map<char, Location> directionChange;
char Hd[4];
char Pd[4] = {'N', 'S', 'W', 'E'};bool isValid(int x, int y, int n, int m) {return x >= 0 && y >= 0 && x < n && y < m;
}int solve(int n, int m) {queue< Node > q;q.push(Node(P.x, P.y, H.x, H.y, 0));visited[P.x][P.y][H.x][H.y] = true;while (!q.empty()) {Node current = q.front();q.pop();if (current.step > 255) {return -1;}current.step++;for (int i = 0; i != 4; ++i) {int Px = current.Px + directionChange[Pd[i]].x;int Py = current.Py + directionChange[Pd[i]].y;int Hx = current.Hx + directionChange[Hd[i]].x;int Hy = current.Hy + directionChange[Hd[i]].y;if (pict[Hx][Hy] == '#') {Hx = current.Hx;Hy = current.Hy;}if (isValid(Px, Py, n, m) && isValid(Hx, Hy, n, m)) {if (pict[Px][Py] == '.' && pict[Hx][Hy] != '!' && !visited[Px][Py][Hx][Hy]) {if ((Hx == current.Px && Hy == current.Py && Px == current.Hx && Py == current.Hy) ||(Px == Hx && Py == Hy)) {return current.step;}visited[Px][Py][Hx][Hy] = true;q.push(Node(Px, Py, Hx, Hy, current.step));}}}}return -1;
}int main(int argc, char const *argv[])
{int n, m;while (cin >> n >> m) {memset(visited, false, sizeof(visited));for (int i = 0; i != n; ++i) {for (int j = 0; j != m; ++j) {cin >> pict[i][j];if (pict[i][j] == 'P') {pict[i][j] = '.';P.x = i;P.y = j;}if (pict[i][j] == 'H') {pict[i][j] = '.';H.x = i;H.y = j;}}}for (int i = 0; i != 4; ++i) {cin >> Hd[i];}directionChange['N'] = Location(-1, 0);directionChange['S'] = Location(1, 0);directionChange['W'] = Location(0, -1);directionChange['E'] = Location(0, 1);int step = solve(n, m);if (step == -1)cout << "Impossible" << endl;else cout << step << endl;}return 0;
}

 

 

-----------------------------分割线------------------------------------------

 

当代码是如下时:

#include <iostream>
#include <map>
#include <queue>
#include <cstring>using namespace std;char pict[20][20];
bool visited[20][20][20][20];struct Node {Node(int Px_ = 0, int Py_ = 0, int Hx_ = 0, int Hy_ = 0, int step_ = 0):Px(Px_), Py(Py_), Hx(Hx_), Hy(Hy_), step(step_) { }int Px, Py, Hx, Hy;int step;
};struct Location {Location(int x_ = 0, int y_ = 0) : x(x_), y(y_) { }int x, y;
};Location P, H;
map<char, Location> directionChange;
char Hd[4];
char Pd[4] = {'N', 'S', 'W', 'E'};bool isValid(int x, int y, int n, int m) {return x >= 0 && y >= 0 && x < n && y < m;
}int solve(int n, int m) {queue< Node > q;q.push(Node(P.x, P.y, H.x, H.y, 0));visited[P.x][P.y][H.x][H.y] = true;while (!q.empty()) {Node current = q.front();q.pop();if (current.step > 255) {return -1;}if (current.Px == current.Hx && current.Py == current.Hy) {return current.step;}current.step++;for (int i = 0; i != 4; ++i) {int Px = current.Px + directionChange[Pd[i]].x;int Py = current.Py + directionChange[Pd[i]].y;int Hx = current.Hx + directionChange[Hd[i]].x;int Hy = current.Hy + directionChange[Hd[i]].y;if (pict[Hx][Hy] == '#') {Hx = current.Hx;Hy = current.Hy;}if (isValid(Px, Py, n, m) && isValid(Hx, Hy, n, m)) {if (pict[Px][Py] == '.' && pict[Hx][Hy] != '!' && !visited[Px][Py][Hx][Hy]) {if (Hx == current.Px && Hy == current.Py && Px == current.Hx && Py == current.Hy) {return current.step;}visited[Px][Py][Hx][Hy] = true;q.push(Node(Px, Py, Hx, Hy, current.step));}}}}return -1;
}int main(int argc, char const *argv[])
{int n, m;while (cin >> n >> m) {memset(visited, false, sizeof(visited));for (int i = 0; i != n; ++i) {for (int j = 0; j != m; ++j) {cin >> pict[i][j];if (pict[i][j] == 'P') {pict[i][j] = '.';P.x = i;P.y = j;}if (pict[i][j] == 'H') {pict[i][j] = '.';H.x = i;H.y = j;}}}for (int i = 0; i != 4; ++i) {cin >> Hd[i];}directionChange['N'] = Location(-1, 0);directionChange['S'] = Location(1, 0);directionChange['W'] = Location(0, -1);directionChange['E'] = Location(0, 1);int step = solve(n, m);if (step == -1)cout << "Impossible" << endl;else cout << step << endl;}return 0;
}

改了 n 次都是 WA,很奇怪,因为这里和第一份代码的效果应该是一样的,因为是广搜,就算是因为在

if (Hx == current.Px && Hy == current.Py && Px == current.Hx && Py == current.Hy) {return current.step;}

这里提前返回了,那也是同一层,那么步数应该是一样的。那么就只有一种情况会出现错误了,如下:

                            

当能达到结果的树形状如上的时候,1 是要在遍历下一层节点的时候才会发现它是不是达到目标状态的,这个时候,2反而先被发现,但 2 并不是最短的,所以此时会出错。

 

转载于:https://www.cnblogs.com/xiezhw3/p/4165142.html

这篇关于sicily 1215. 脱离地牢的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/282932

相关文章

试一试Tyrant地牢生成算法

话题 我看到一篇文章讲了一种 Roguelike 地牢生成算法:一种 Roguelike 地牢生成算法 | indienova 独立游戏。这篇文章是翻译,原作者是一款名叫“Tyrant”游戏的作者,在讲自己制作这款游戏时用的地牢生成算法。可我没找到这款游戏的发行版,源代码倒是有:Tyrant - Java Roguelike download | SourceForge.net。可惜是Java工

el-table使用#header自定义表头后脱离响应式问题处理

问题描述:当titleList的值进行筛选改变的时候#header里面的的数据并没有实时响应,如下面的代码 <el-table :data="newData" border style="width: 100%"><el-table-columnv-for="(day, index) in titleList" :key="day.date"width="600"align="center">

快速了解 Java 9 - 16 新特性,助你脱离内卷

点击上方“朱小厮的博客”,选择“设为星标” 后台回复"书",获取 后台回复“k8s”,可领取k8s资料 JAVA 这几年的更新实在是太太太……快了,JAVA 8 都还没用多久,16 都已经发布了。自从 JAVA 8 发布了 Lambda 和 Stream 之后,JAVA 就像打了鸡血一样,半年一个版本的发布,生产队的驴也没这么勤快。 导致我们现在完全跟不上 JAVA 发布的节奏,我司目前还停留

sicily 分类

原文出处:http://linguifan2010.blog.163.com/blog/static/1315127442010102131322482/ *************************程序设计题************************* *************************数据结构************************* sicily

破碎的像素地牢探险:游戏分享

软件介绍 《破碎的像素地牢》是开源一款地牢冒险探索类的游戏,融合了日系RPG经典风格,玩家将控制主角进行未知场景的探索。除了经典地牢玩法外,游戏还添加了更多创意内容,如黑屏状态前的挑战性等,使得游戏更加富有挑战性。玩家可以选择不同职业的角色,如战士、法师、盗贼等,在地下城展开冒险之旅。 使用方法 《破碎的像素地牢》具有高度的复玩性,每局随机生成楼层、敌人和道具,带来全新的游戏体验。游戏中

CSS - 说一说什么是脱离文档流

说脱离文档流之前呢,我们得知道什么是文档流吧。人们常说你脱离组织了,脱离大部队了,你连大部队都没有加入,还脱离个啥呀,是吧。 文档流 我们知道HTML中有盒模型,有行内元素,有块元素,对吧。 行内元素会横向排列,块元素会换行排列,而盒模型呢,又表示每个元素都会占据一定的文档位置。如果不写CSS样式呢,我们单纯的只写HTML标签元素,这些元素们就会遵循文档流的原则,正常排列。当网页元素内容多起

关于Mysql建外键报1215错误

今天在mysql中建外键,一直报1215的错误,找了许久才找到了解决办法。 原因:建外键的时候,外键的类型是int型。引用的主键类型也是int型,并且所有的主键均设计的自增, 这个时候,实际我的这个主键的字段类型是unsigned int,主键和外键的类型不统一,所以会报错,无法添加外键了。 解决方法:将主键字段改为无符号整形,并且外键的字段类型也改为无符号整形。 然后添加外键,一

HDUnbsp;1215--七夕节

七夕节 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2628 Accepted Submission(s): 986 Problem Description 七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的

CSS实现dom脱离文档流定位固定位置的操作代码

在CSS中,如果你想让一个DOM元素脱离文档流并固定在一个特定的位置,你通常会使用position属性,并为其指定fixed、absolute或relative值。但是,fixed是最常用于将元素固定在视口(viewport)的某个位置,而不管页面滚动如何。 下面是一个使用position: fixed;的示例,它将一个元素固定在屏幕的右上角: <!DOCTYPE html> <html

1215 Cannot add the foreign key constraint

使用navicat创建外键约束的时候出错了,一直报如题的错误,而且还死活过不了。 原因:两个字段的属性不同,一个允许为空,一个不允许。 解决:被约束的外键和被关联的主键属性要一样,比如: 类型名,长度,无符号,允许空值之类的。