UVA 816 Abbott's Revenge 紫书
紫书的这道题, 作者说是很重要。
但看着题解好长, 加上那段时间有别的事, 磨了几天没有动手。
最后,这道题我打了五遍以上 ,有两次被BUG卡了,找了很久才找到。
思路紫书上有,就缺少输入和边界判断两个部分。不是因为紫书,应该也不会找到这个WF题吧,所以其余思路就不说了。 一些注释在代码中有。
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
using namespace std; const int MAXN = ;
const char* dirs = "NESW";
const char* turns = "FLR";
int dir_id(char c) {return strchr(dirs, c)-dirs;}
int turn_id(char c) {return strchr(turns, c)-turns;}
const int dr[] = {-, , , };
const int dc[] = {, , , -}; struct Node
{
int r;
int c;
int dir;
Node(int rr=, int cc=, int d=):r(rr), c(cc), dir(d) {}
}; int has_edge[MAXN][MAXN][][];
int d[MAXN][MAXN][];//判断是否遍历过
Node p[MAXN][MAXN][];
int r0, c0, r1, c1, r2, c2, dir; Node walk(const Node& u, int turn)
{
int dir=u.dir;
if(turn==) dir = (dir+)%;//逆时针
if(turn==) dir = (dir+)%;//顺时针
return Node(u.r+dr[dir], u.c+dc[dir], dir);
} bool inside(int r, int c)//判断是否出界
{
return r>= && r<= && c>= && c<=;
} bool read_case()
{
char s1[], s2[];//储存名字, 储存方向
if(scanf("%s%d%d%s%d%d", s1, &r0, &c0, s2, &r2, &c2)!=) return false;//输入不正确
printf("%s\n", s1);
memset(has_edge, , sizeof(has_edge)); dir = dir_id(s2[]);
r1 = r0+dr[dir];
c1 = c0+dc[dir]; for(; ;)
{
int r, c;
scanf("%d", &r);
if(r==) break;
scanf("%d", &c);
while(scanf("%s", s2)== && s2[]!='*')
{
int len=strlen(s2);
for(int i=; i<len; i++)
has_edge[r][c][dir_id(s2[])][turn_id(s2[i])]=;//将可走的地方赋1
}
}
return true;
} void print_ans(Node u)
{
vector<Node> nodes;
for(; ;)//输入
{
nodes.push_back(u);
if(d[u.r][u.c][u.dir]==) break;
u = p[u.r][u.c][u.dir];
}
nodes.push_back(Node(r0, c0, dir));//起点存入 int cnt=;
for(int i=nodes.size()-; i>=; i--)//倒着输出
{
// cout<<"#i"<<endl;
if(cnt% == ) printf(" ");
printf(" (%d,%d)", nodes[i].r, nodes[i].c);
if(++cnt % ==) printf("\n");
}
if(nodes.size()%!=) printf("\n");
} void solve()
{
queue<Node> q;
memset(d, -, sizeof(d));
Node u(r1, c1, dir);
d[u.r][u.c][u.dir]=;
q.push(u);
while(!q.empty())
{
Node now = q.front(); q.pop();
if(now.r==r2 && now.c==c2)
{
print_ans(now);
return;
} for(int i=; i<; i++)
{
Node v = walk(now, i);
if(has_edge[now.r][now.c][now.dir][i] && d[v.r][v.c][v.dir]< && inside(v.r, v.c))
{
d[v.r][v.c][v.dir] = d[now.r][now.c][now.dir]+;
p[v.r][v.c][v.dir] = now;
q.push(v);
}
}
}
printf(" No Solution Possible\n");
} int main()
{
while(read_case())
solve(); return ;
}
毕竟完成了一题WF题,虽然开始的思路不是自己想的,但还是感觉有一丝丝成就感,哈哈。
UVA 816 Abbott's Revenge 紫书的更多相关文章
- UVA 816 -- Abbott's Revenge(BFS求最短路)
UVA 816 -- Abbott's Revenge(BFS求最短路) 有一个 9 * 9 的交叉点的迷宫. 输入起点, 离开起点时的朝向和终点, 求最短路(多解时任意一个输出即可).进入一个交叉 ...
- UVA 816 Abbott’s Revenge
bfs求最短路,递归打印最短路的具体路径: 难点: 当前状态和转弯方式很复杂,要仔细处理: 递归打印:用一个数组存储路径中结点的前一个节点,递归查找 (bfs无法确定下一个结点,但对于没一个结点,它的 ...
- uva 816 abbott's revenge ——yhx
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAncAAAN5CAYAAABqtx2mAAAgAElEQVR4nOy9sY4jydKezVuoayhH0r
- Uva - 816 - Abbott's Revenge
这个迷宫问题还是挺好玩的,多加了一个转向的问题,有些路口不同的进入方式会有不同的转向限制,这个会比较麻烦一点,所以定义结点结构体的时候需要加一个朝向dir.总体来说是一道BFS求最短路的问题.最后打印 ...
- Uva 816 Abbott's Revenge(BFS)
#include<cstdio> #include<cstring> #include<vector> #include<queue> using na ...
- UVA - 816 Abbott's Revenge(bfs)
题意:迷宫从起点走到终点,进入某点的朝向不同,可以出去的方向也不同,输出最短路. 分析:因为朝向决定接下来在该点可以往哪里走,所以每个点需要有三个信息:x,y,d(坐标和进入该点的朝向),所以将起点的 ...
- UVA 816 - Abbott's Revenge(BFS)
UVA 816 - Abbott's Revenge option=com_onlinejudge&Itemid=8&page=show_problem&category=59 ...
- uva 816 Abbott的复仇
题目链接:https://uva.onlinejudge.org/external/8/816.pdf 紫书:P165 题意: 有一个最多包含9*9个交叉点的迷宫.输入起点.离开起点时的朝向和终点,求 ...
- UVa 11582 Colossal Fibonacci Numbers! 紫书
思路是按紫书上说的来. 参考了:https://blog.csdn.net/qwsin/article/details/51834161 的代码: #include <cstdio> # ...
随机推荐
- 【[SDOI2017]数字表格】
求 \[Ans=\prod_{i=1}^N\prod_{j=1}^MFib[(i,j)]\] 连乘的反演,其实并没有什么不一样 我们把套路柿子拿出来 \[F(n)=\sum_{i=1}^N\sum_{ ...
- ElasticSearch 获取es信息以及索引操作
检查集群的健康情况 GET /_cat/health?v green:每个索引的primary shard和replica shard都是active状态的yellow:每个索引的primary sh ...
- virtualbox+vagrant学习-2(command cli)-26-vagrant share命令
Share share命令初始化了一个vagrant share会话,允许你与世界上任何一个人共享vagrant环境,允许在几乎任何网络环境中直接在vagrant环境中进行协作. 你可以在本博客的vi ...
- js之radio应用实例
radio和checkbox还有select,可谓是前后端常用三剑客啊!特别是checkbox和select,关于这两个今天不讲,因为在下面这几篇文章,我已经比较详细的讲解了. SpringMVC之a ...
- mac下git安装和使用
1.下载git客户端,下载地址为:https://git-scm.com/download/mac 2.打开安装包,可以看到此时的界面为: 我们需要把.pkg的安装包安装到系统当中.我双击了安装包 ...
- HDU 3577Fast Arrangement(线段树模板之区间增减更新 区间求和查询)
Fast Arrangement Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- 树莓派 log 日志 打印到 TXT
#include<stdio.h> #include <stdarg.h> #include <unistd.h> #include <stdint.h> ...
- 学习JavaSE 数组
一维数组 基本概念 1.数组中只允许放同一种类型(可以是父子关系). 2.数组即对象. 例: int[ ] arrs={0,1,2};//arrs即一个对象. 3.数组是定长的,不可以增加或者减少. ...
- jQuery----左侧导航栏面板切换实现
页面运行结果: 点击曹操 点击刘备 点击孙权 原图 需求说明:原图如上所示,点击一方诸侯的时候 ...
- 让你的:active好好工作
在某些版本的safari上,:active伪类不生效,可以通过css和js两种方式hack一下: html <div class="button"> 点击时我应该变红 ...