Uva 816 Abbott's Revenge(BFS)
#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)的更多相关文章
- UVA 816 -- Abbott's Revenge(BFS求最短路)
UVA 816 -- Abbott's Revenge(BFS求最短路) 有一个 9 * 9 的交叉点的迷宫. 输入起点, 离开起点时的朝向和终点, 求最短路(多解时任意一个输出即可).进入一个交叉 ...
- UVA - 816 Abbott's Revenge(bfs)
题意:迷宫从起点走到终点,进入某点的朝向不同,可以出去的方向也不同,输出最短路. 分析:因为朝向决定接下来在该点可以往哪里走,所以每个点需要有三个信息:x,y,d(坐标和进入该点的朝向),所以将起点的 ...
- uva 816 abbott's revenge ——yhx
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAncAAAN5CAYAAABqtx2mAAAgAElEQVR4nOy9sY4jydKezVuoayhH0r
- UVA 816 Abbott’s Revenge
bfs求最短路,递归打印最短路的具体路径: 难点: 当前状态和转弯方式很复杂,要仔细处理: 递归打印:用一个数组存储路径中结点的前一个节点,递归查找 (bfs无法确定下一个结点,但对于没一个结点,它的 ...
- Uva - 816 - Abbott's Revenge
这个迷宫问题还是挺好玩的,多加了一个转向的问题,有些路口不同的进入方式会有不同的转向限制,这个会比较麻烦一点,所以定义结点结构体的时候需要加一个朝向dir.总体来说是一道BFS求最短路的问题.最后打印 ...
- UVA 816 Abbott's Revenge 紫书
紫书的这道题, 作者说是很重要. 但看着题解好长, 加上那段时间有别的事, 磨了几天没有动手. 最后,这道题我打了五遍以上 ,有两次被BUG卡了,找了很久才找到. 思路紫书上有,就缺少输入和边界判断两 ...
- UVA 816 - Abbott's Revenge(BFS)
UVA 816 - Abbott's Revenge option=com_onlinejudge&Itemid=8&page=show_problem&category=59 ...
- uva 816 - Abbott's Revenge(有点困难bfs迷宫称号)
是典型的bfs,但是,这个问题的目的在于读取条件的困难,而不是简单地推断,需要找到一种方法来读取条件.还需要想办法去推断每一点不能满足条件,继续往下走. #include<cstdio> ...
- UVa 816 Abbott的复仇(BFS)
寒假的第一道题目,在放假回家颓废了两天后,今天终于开始刷题了.希望以后每天也能多刷几道题. 题意:这道BFS题还是有点复杂的,给一个最多9*9的迷宫,但是每个点都有不同的方向,每次进入该点的方向不同, ...
随机推荐
- 蓝桥杯—BASIC-25 回形取数
题目:回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度.一开始位于矩阵左上角,方向向下.输入格式 输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列.接下来m行每行 ...
- C++解析五-this 指针,指向类的指针
C++this指针 在 C++ 中,每一个对象都能通过 this 指针来访问自己的地址.this 指针是所有成员函数的隐含参数.因此,在成员函数内部,它可以用来指向调用对象.友元函数没有 this 指 ...
- learning at command AT+CSQ
AT command AT+CSQ [Purpose] Learning how to get mobile module single quality report [Eeviro ...
- 学习Linux系统的方法有很多,适合自己的才是最好
综观现在互联网+的发展以及应用,作为一个从事IT行业的人员,应该懂得Linux占比多大份量,所以说,去掌握Linux是一种相当重要的谋生途径,当然,如果你对它产生情感那更好.这篇文章主要是本人结合自身 ...
- 【原创】QT简单计算器
代码 //main.cpp #include "calculator_111.h" #include <QtWidgets/QApplication> int main ...
- Python Django 之 Template 模板的使用
一.模板样式 注意: 1.url urlpatterns = { path('admin/', admin.site.urls), path('order/', views.order), path( ...
- 读书笔记 C# 接口之浅析
一.接口可以包含 属性.方法.事件和索引器: 二.接口不能被实例化: 三.一个类可以继承多个接口: 四.接口不能包含方法的实现: 五.继承接口的类必须实现接口中所有成员: 六.显式实现接口的成员,不能 ...
- tfs 2017 使用
安装完成之后,创建一个项目管理. 初始化代码库 然后下载代理 (服务器)并设置.下载代理需要FQ才可以下载成功. 想要支持 netcore2.0 必须在代理服务器上安装 vs2017 跟netcor ...
- 2.1FTP的简单传输
第一个简单的FTP传输实例 from ftplib import FTP nonpassive = False filename = 'new_1.py' dirname = '.' sitename ...
- DevExpress WinForms v18.2新版亮点(四)
行业领先的.NET界面控件2018年第二次重大更新——DevExpress v18.2日前正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress WinForms v1 ...