#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
using namespace std; struct Node
{
int row,col,dir;
Node(int row=,int col=,int dir=):row(row),col(col),dir(dir) {}
}; const char * dirs="NESW";
const char * turns="FLR";
const int maxn=; int have_way[maxn][maxn][][];///进入方向最多有4个,转弯方向最多有3个,最多是9*9的迷宫
int visit[maxn][maxn][];///0为起点,-1表示未被访问,1表示路径中的点
Node pre[maxn][maxn][];
int row0,col0, dir, row1, col1, row2, col2; int dir_id(char c)
{
return strchr(dirs, c) - dirs;
} int turn_id(char c)
{
return strchr(turns, c) - turns;
} const int dirrow[] = {-, , , };
const int dircol[] = {, , , -}; bool input()
{
char s[],s2[];
if(scanf("%s%d%d%s%d%d", s, &row0, &col0, s2, &row2, &col2) != ) return false;///输入初始位置
printf("%s\n", s); dir=dir_id(s2[]);
row1 = row0 + dirrow[dir];
col1 = col0 + dircol[dir]; memset(have_way,,sizeof(have_way));
for(;;)
{
int row, col;
scanf("%d",&row);
if(row==) break;
scanf("%d",&col);
while(scanf("%s",s)==&&s[]!='*')
{
for(int i=; i<strlen(s); i++)
have_way[row][col][dir_id(s[])][turn_id(s[i])]=;///输入每个点的进入方向及通行方向
}
}
return true;
} bool inside(int row,int col)
{
return row >= && row <= && col >= && col <= ;
} Node walk(Node t,int turn)
{
int dir=t.dir;
if(turn ==) dir = (dir+)%;///按顺时针+3就是对应的转弯方向,即是向右
if(turn==) dir=(dir+)%;///按顺时针+3就是对应的转弯方向,即是向左
return Node(t.row+dirrow[dir],t.col+dircol[dir],dir);
} void print(Node u)
{
vector<Node> nodes;/// 从目标结点逆序追溯到初始结点
for(;;)
{
nodes.push_back(u);
if(visit[u.row][u.col][u.dir]==) break;
u=pre[u.row][u.col][u.dir];
}
nodes.push_back(Node(row0,col0,dir));
int cnt = ;
for(int i = nodes.size()-; i >= ; i--)/// 打印解,每行10个
{
if(cnt % == ) printf(" ");
printf(" (%d,%d)", nodes[i].row, nodes[i].col);
if(++cnt % == ) printf("\n");
}
if(nodes.size() % != ) printf("\n");
} void run()
{
queue<Node> q;
memset(visit,-,sizeof(visit));
Node u(row1, col1, dir);
visit[u.row][u.col][u.dir]=;
q.push(u);
while(!q.empty())
{
Node u=q.front();
q.pop();
if(u.row == row2 && u.col == col2)///到达边界
{
print(u);
return;
}
for(int i = ; i < ; i++)///0~2表示前行,右转,左转
{
Node v = walk(u, i);
if(have_way[u.row][u.col][u.dir][i] && inside(v.row, v.col) && visit[v.row][v.col][v.dir] < )
{
visit[v.row][v.col][v.dir] = visit[u.row][u.col][u.dir] + ;
pre[v.row][v.col][v.dir] = u;///记录前驱
q.push(v);
}
}
}
printf(" No Solution Possible\n");
} int main()
{
while(input())
{
run();
}
return ;
}

Uva 816 Abbott's Revenge(BFS)的更多相关文章

  1. UVA 816 -- Abbott's Revenge(BFS求最短路)

     UVA 816 -- Abbott's Revenge(BFS求最短路) 有一个 9 * 9 的交叉点的迷宫. 输入起点, 离开起点时的朝向和终点, 求最短路(多解时任意一个输出即可).进入一个交叉 ...

  2. UVA - 816 Abbott's Revenge(bfs)

    题意:迷宫从起点走到终点,进入某点的朝向不同,可以出去的方向也不同,输出最短路. 分析:因为朝向决定接下来在该点可以往哪里走,所以每个点需要有三个信息:x,y,d(坐标和进入该点的朝向),所以将起点的 ...

  3. uva 816 abbott's revenge ——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAncAAAN5CAYAAABqtx2mAAAgAElEQVR4nOy9sY4jydKezVuoayhH0r

  4. UVA 816 Abbott’s Revenge

    bfs求最短路,递归打印最短路的具体路径: 难点: 当前状态和转弯方式很复杂,要仔细处理: 递归打印:用一个数组存储路径中结点的前一个节点,递归查找 (bfs无法确定下一个结点,但对于没一个结点,它的 ...

  5. Uva - 816 - Abbott's Revenge

    这个迷宫问题还是挺好玩的,多加了一个转向的问题,有些路口不同的进入方式会有不同的转向限制,这个会比较麻烦一点,所以定义结点结构体的时候需要加一个朝向dir.总体来说是一道BFS求最短路的问题.最后打印 ...

  6. UVA 816 Abbott's Revenge 紫书

    紫书的这道题, 作者说是很重要. 但看着题解好长, 加上那段时间有别的事, 磨了几天没有动手. 最后,这道题我打了五遍以上 ,有两次被BUG卡了,找了很久才找到. 思路紫书上有,就缺少输入和边界判断两 ...

  7. UVA 816 - Abbott&#39;s Revenge(BFS)

    UVA 816 - Abbott's Revenge option=com_onlinejudge&Itemid=8&page=show_problem&category=59 ...

  8. uva 816 - Abbott&#39;s Revenge(有点困难bfs迷宫称号)

    是典型的bfs,但是,这个问题的目的在于读取条件的困难,而不是简单地推断,需要找到一种方法来读取条件.还需要想办法去推断每一点不能满足条件,继续往下走. #include<cstdio> ...

  9. UVa 816 Abbott的复仇(BFS)

    寒假的第一道题目,在放假回家颓废了两天后,今天终于开始刷题了.希望以后每天也能多刷几道题. 题意:这道BFS题还是有点复杂的,给一个最多9*9的迷宫,但是每个点都有不同的方向,每次进入该点的方向不同, ...

随机推荐

  1. IIS发布网站,访问时出现无法识别的属性“targetFramework”错误

    今天在IIS发布网站后,访问时出现无识别的属性“targetFramework”错误 错误描述: 错误原因: 是由IIS配置该站点的.NET Framework 版本与程序中的.NET Framewo ...

  2. linux的典型分支:

    1.redhat 2.debian 3.centOS 4.ubuntu 5.fedora 6.kali linux

  3. learning scala control statement

    1 .if satement 与其它语言不同的是,scala if statement 返回的是一个值 scala> val a = if ( 6 > 0 ) 1 else -1a: In ...

  4. Vue + Element UI 实现权限管理系统(国际化实现)

    国际化支持 1.安装依赖 执行以下命令,安装 i18n 依赖. yarn add vue-i18n $ yarn add vue-i18n yarn add v1.9.4 warning packag ...

  5. Python Oracle连接与操作封装

    一.封装方式一 #encoding:utf-8 import cx_Oracleclass Oracle_Status_Output:    def __init__(self,db_name,db_ ...

  6. ArrayList和LinkedList有什么区别?

    ---恢复内容开始--- ArrayList和LinkedList都实现了List接口,但是: ArrayList是基于索引的数据接口,底层是数组,能够以O(1)时间复杂度随机访问元素.而Linked ...

  7. SQL-1 选取表中某一属性最大值的所有信息 查找最晚入职员工的所有信息

    题目描述 查找最晚入职员工的所有信息CREATE TABLE `employees` (`emp_no` int(11) NOT NULL,`birth_date` date NOT NULL,`fi ...

  8. Java学习笔记整理第一章 java基本数据类型、修饰符、运算符

    Java关键字: Java关键字是电脑语言里事先定义的,有特别意义的标识符,有时又叫保留字,还有特别意义的变量.Java的关键字对Java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的 ...

  9. 安装gcc

    yum -y install gcc yum -y install gcc-c++ yum install make   -- 或者 yum groupinstall "Developmen ...

  10. JavaScript作用域及作用域链详解、声明提升

    相信大家在入门JavaScript这门语言时对作用域.作用域链.变量声明提升这些概念肯定会稀里糊涂,下面就来说说这几个 Javascript 作用域 在 Javascript 中,只有局部作用域和全局 ...