题意:一个迷宫,每个交叉路口有一路标,限制了你从某方向进入该路口所能进入的路口。

题解:1.对于方向的处理:将node多增加一维dir,通过一个const 字符数组 加 上dir_id函数 以及一个方向数组 快速完成从读取字母到模拟路口限制的转换。

   2.用一个四位数组记录某节点某方向是否能走,

      3.对于路径的记录,用node p[] 记录当前节点的前一个节点,然后将其中的元素push到一个vector里面再输出。

  

坑:1.no possible input 多了个空格(紫书上没有前缀空格)

  自己写的read_input,结果显示忘记了初始化,

  第一步理解错误。

#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include<stdio.h>
#include<algorithm>
#include<string>
#include<vector>
#include<list>
#include<set>
#include<iostream>
#include<string.h>
#include<queue>
#include<string>
#include<sstream>
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[] = { ,,,- };
//NESW
int r1, c1,r0,c0,r2,c2,dir,mxr,mxc; struct node {
int r, c, dir;
node(int r = , int c = , int dir = ) :r(r), c(c), dir(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);
}
int d[maxn][maxn][maxn];
node p[maxn][maxn][maxn];
int has_edge[maxn][maxn][maxn][maxn];
bool inside(int r,int c) {
return (r>=&&r<=&&c>=&&c<=);
}
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--) {
if (cnt % == ) cout << ' ';
printf(" (%d,%d)", nodes[i].r, nodes[i].c);
if (++cnt % == ) cout << endl;
}
if (nodes.size() % != )cout << endl;
}
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 u = Q.front(); Q.pop();
if (u.r == r2&&u.c == c2) { print_ans(u); return; }
for (int i = ; i < ; i++) {
node v = walk(u, i);
if (has_edge[u.r][u.c][u.dir][i] && d[v.r][v.c][v.dir] < &&inside(v. r,v.c)) {
d[v.r][v.c][v.dir] = d[u.r][u.c][u.dir] + ;
p[v.r][v.c][v.dir] = u;
Q.push(v);
}
} }
printf(" No Solution Possible\n");
}
string s;
bool read_input() { string ch;
cin >> s; if (s == "END")return false;
cout << s << endl; cin >> r0 >> c0 >>ch>>r2>>c2;//mxr=max(r0,r) dir = dir_id(ch[]);
r1 = r0 + dr[dir];
c1 = c0 + dc[dir];
memset(has_edge, , sizeof(has_edge));
//node u1 (r0, c0, dir);
//u1 = walk(u1, dir);
//r1 = u1.r, c1 = u1.c, dir = u1.dir;
int c, r;
while (cin >> r) {
if (r == )break;
cin >> c;
char ss[];
for (;;) {
scanf("%s", ss);
if (ss[] == '*')break;
for (int i = ; i < strlen(ss); i++)
has_edge[r][c][dir_id(ss[])][turn_id(ss[i])]=;
}
}
return true;
}
int main(){
while (read_input()) { solve();
} system("pause");
return ;
}

【紫书】【重要】Abbott's Revenge UVA - 816 bfs 复杂模拟 带方向参数的迷宫的更多相关文章

  1. Abbott's Revenge UVA - 816 (输出bfs路径)

    题目链接:https://vjudge.net/problem/UVA-816 题目大意: 有一个最多包含9*9 个交叉点的迷宫.输入起点,离开起点时的朝向和终点,求一条最短路(多解时任意输出 一个即 ...

  2. UVa 816 (BFS求最短路)

    /*816 - Abbott's Revenge ---代码完全参考刘汝佳算法入门经典 ---strchr() 用来查找某字符在字符串中首次出现的位置,其原型为:char * strchr (cons ...

  3. BFS求最短路 Abbottt's Revenge UVa 816

    本题的题意是输入起点,朝向和终点,求一条最短路径(多解时任意输出一个即可) 本题的主要代码是bfs求解,就是以下代码中的slove的主要部分,通过起点按照路径的长度来寻找最短路径,输出最先到终点的一系 ...

  4. 【紫书】Undraw the Trees UVA - 10562 递归,字符串

    题意:给你画了一颗树,你要把它的前序输出. 题解:读进到二维数组.边解析边输出. 坑:少打了个-1. #define _CRT_SECURE_NO_WARNINGS #include<cstri ...

  5. 【紫书】Play on Words UVA - 10129 欧拉回路

    题意:给你1e5个字符串,若前一个的末尾字母等于当前的首字母,则可以连在一起(成语接龙一个意思)判断是否可以将他们连在一起 题解:将首位看作点,单词看作边.变成欧拉回路问题. 判断出入度是否相等,再用 ...

  6. 【紫书】 The Falling Leaves UVA - 699 递归得简单

    题意:给你一颗二叉树的前序遍历,空子树以-1表示,将左右子树的权值投影到一维数轴上,左儿子位置为根位置-1,右儿子+1求个个整点上的和: 题解:递归,整个过程只需维护一个sum数组. 更新根,更新le ...

  7. uva 816 BFS求最短路的经典问题……

    一开始情况没有考虑周全,直接WA掉了, 然后用fgets()出现了WA,给改成scanf就AC了 题目不是很难,用心就好…… #include <iostream> #include &l ...

  8. UVA 816 bfs

    算法入门经典上面的题.题目链接 uva816 大致题意 有一个最多包含9*9个交叉点的迷宫.输入起点.离开起点时的朝向和终点,求一条最短路(多解时任意输出一个即可).详细题意请看原题 思路 其实就是b ...

  9. UVA816 Abbott's Revenge (三元组BFS)

    题目描述: 输入输出: 输入样例: SAMPLE 3 1 N 3 3 1 1 WL NR * 1 2 WLF NR ER * 1 3 NL ER * 2 1 SL WR NF * 2 2 SL WF ...

随机推荐

  1. 8 -- 深入使用Spring -- 4...2 使用AspectJ实现AOP

    8.4.2 使用AspectJ实现AOP AspectJ是一个基于Java语言的AOP框架.Spring 4.0 的AOP对AspectJ很好的集成. AspectJ是Java 语言的一个AOP实现, ...

  2. 找不同diff-打补丁patch

    Q:为什么要找不同,为什么要打补丁? A: 在Linux应用中,作为DBA,我们知道MySQL跑在Linux系统之上,数据库最重要的追求就是性能,“稳”是重中之重,所以不能动不动就是换系统或是换这换那 ...

  3. Kafka controller重设计

    本文主要参考社区0.11版本Controller的重设计方案,试图给大家梳理一下Kafka controller这个组件在设计上的一些重要思考.众所周知,Kafka中有个关键组件叫controller ...

  4. [转]redis的三种启动方式

    来源:https://www.cnblogs.com/pqchao/p/6549510.html redis的启动方式1.直接启动  进入redis根目录,执行命令:  #加上‘&’号使red ...

  5. linux系统开机自启程序-需要-root用户 -启动 -

    #!/bin/bashsh /home/hwjc/RSA/release2017-02-23/release2017-02-23/install.shsh /etc/init.d/mqtt.shifc ...

  6. C语言结构体和指针

    指针也可以指向一个结构体,定义的形式一般为: struct 结构体名 *变量名; 下面是一个定义结构体指针的实例: struct stu{ char *name; //姓名 int num; //学号 ...

  7. android模拟器与PC的端口映射

    一.概述 Android系统为实现通信将PC电脑IP设置为10.0.2.2,自身设置为127.0.0.1,而PC并没有为Android模拟器系统指定IP,所以PC电脑不能通过IP来直接访问Androi ...

  8. Linux下Apache网站目录读写权限的设置

    网站目录文件权限的设置对网站的安全至关重要,下面简单介绍网站目录文件权限的基本设定. 我们假设http服务器运行的用户和用户组是www,网站用户为centos,网站根目录是/home/centos/w ...

  9. C语言EOF是什么?

    C语言 EOF是什么? Linux中,在新的一行的开头,按下Ctrl-D,就代表EOF(如果在一行的中间按下Ctrl-D,则表示输出"标准输入"的缓存区,所以这时必须按两次Ctrl ...

  10. 发现linux主机再用代理上网的情况下不能用wget从外网下载资源

    公司禁网(也不是完全禁,能连接外网数据库,不能下载东西,不能打开网页,但是却能打开谷歌的收索页面,只是不能点进网页) 发现linux主机再用代理上网的情况下不能用wget从外网下载资源,但是却可以从内 ...