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> # ...
随机推荐
- 我的linux shell 脚本头部
#!/bin/bash #################################################### # version:1.01 # # link:http://www. ...
- 史上最详细的codeblocks安装教程!!!
codeblocks下载地址:https://www.cnblogs.com/yinbiao/p/8489748.html 下面是codeblocks具体的安装教程:
- CentOS 6.4 编译安装 gcc 4.8.1
今天在isocpp上看到“GCC 4.8.1 released, C++11 feature complete”这个消息,非常兴奋.终于有一个全面支持C++11语言特性的编译器了! 当然了,gcc仅仅 ...
- oracle 子查询 where having from ,from子查询提高效率
where 子查询主要功能是控制数据行的,返回结果一般都是单行单列.多行单列.单行多列数据 单行单列 SELECT * FROM emp WHERE hiredate=( SELECT MIN(hir ...
- Vue+axios 实现http拦截及vue-router拦截
现如今,每个前端对于Vue都不会陌生,Vue框架是如今最流行的前端框架之一,其势头直追react.最近我用vue做了一个项目,下面便是我从中取得的一点收获. 基于现在用vue+webpack搭建项目的 ...
- PHP 回调函数call_user_func和 call_user_func_array()的理解
call_user_func(function,param); // 第一个参数是回调函数的函数名,第二个参数是参数 call_user_func函数类似于一种特别的调用函数的方法.其主要有以下的类型 ...
- 用脚本js把结果转化为固定小数位的形式
function roundTo(base,precision) { var m=Math.pow(10,precision); var a=Math.round(base * m) / m; ret ...
- Installation failed: Timeout was reached: Operation timed out after 10000 milliseconds with 0 out of 0 bytes received
Trying this option worked for me. library(httr) with_config(use_proxy(...), install_github(...)) OR ...
- R语言学习笔记(二十二):字符串处理中的函数对比(代码实现)
字符串处理中基本函数的使用 R自带函数与stringr包函数对比 > states <- row.names(USArrests) > # 提取字符串子集 > substr(x ...
- 使用uliweb创建一个简单的blog
1.创建数据库 uliweb的数据库都在models.py文件里面,因此先创建该文件 vim apps/blog/models.py 添加如下两行: #coding=utf-8 from uliweb ...