#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. 逆袭之旅.DAY08东软实训.多态~

    2018年7月4日

  2. tomcat 线程数与 mysql 连接数综合调优

    目前线上系统包含 数据收集+数据分析+中心服务,三个均为 tomcat,共用一个mysql服务. 由于tomcat最大线程数200 *3 =600,最大并发时,会有600个jdbc连接.当然这是极端情 ...

  3. js如何调试,使用debug模式

    js的代码断点调试非常简单,不需要借助代码编辑器,只要浏览器就行了(注意:html代码打断点是没有用的,只有js的才行,下图第二步打开开发者模式使用F12才对):

  4. 界面控件DevExpress发布v18.2.5|附下载

    DevExpress Universal Subscription(又名DevExpress宇宙版或DXperience Universal Suite)是全球使用广泛的.NET用户界面控件套包,De ...

  5. jdk1.8使用的url和driverName的改变

    #dataSource configure connection.url=jdbc:mysql://localhost:3306/shiro?useSSL=false&serverTimezo ...

  6. L291

    If you are currently in the midst of planning a wedding, then I don't need to tell you how stressful ...

  7. day 27 多态 接口 类方法 静态方法 hashlib 摘要算法模块

    # 多态的理解:# Python 天生自带多态# 鸭子类型 list 和 tuple 就是一对鸭子类型 很像但是没有继承关系## 而其他的类型 上传参数或者打印参数的时候 必须是指定的数据类型# -- ...

  8. python scrapy爬虫存储数据库方法带去重步骤

    import pymongo import requests import random import time import pymysql db = pymongo.MongoClient()[' ...

  9. ipython output logging:使用日志记录输出

    通常使用ipython的%logstart日志功能时,仅开启输入的记录. 例如在ipython中开启%logstart后,记录的日志文件内容如下: #!/usr/bin/env python # 20 ...

  10. PCMU G.711U/PCMA G.711A简介

    PCMA(G.711A) 类型:Audio 制定者:ITU-T 所需频宽:64Kbps(90.4) 特性:PCMU和PCMA都能提供较好的语音质量,但是它们占用的带宽较高,需要64kbps. 优点:语 ...