本题的题意是输入起点,朝向和终点,求一条最短路径(多解时任意输出一个即可)

本题的主要代码是bfs求解,就是以下代码中的slove的主要部分,通过起点按照路径的长度来寻找最短路径,输出最先到终点的一系列点

以下代码中,用两个数组保存四个方向,运用函数walk()表示结点的方向变换,通过d[][][]保存路径的长度,p[][][]保存路径中的结点,has_edge[][][][]标记行得通的路径,同时用队列先进先出,层次遍历所有结点,用vector存储将要输出的结点,防止内存空间不够大

 #include<stdio.h>
#include<queue>
#include<string>
#include<string.h>
#include<vector>
#include<iostream>
using namespace std;
const int maxn=;
char name[];
int r0,c0,r1,c1,r2,c2,dir,turn;
char dir0,str[];
int has_edge[maxn][maxn][maxn][maxn]; //表示当前状态,是否可以沿turn的方向行走
int d[maxn][maxn][maxn]; //表示初始状态到(r1,c1,dir)的最短路的长度
string maze_name; const char* dirs="NESW";
const char* turns="FLR";
const int dr[]={-,,,}; //行
const int dc[]={,,,-}; //列
int dir_id(char c){return strchr(dirs,c)-dirs;}
int turn_id(char c){return strchr(turns,c)-turns;} struct Node{
int dir,r,c;
Node(int r=,int c=,int dir=):r(r),c(c),dir(dir){}
}; Node p[maxn][maxn][maxn]; //保存状态 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){
if(r>=&&r<=&&c>=&&c<=) return true;
return false;
} 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%==) printf(" ");
printf(" (%d,%d)",nodes[i].r,nodes[i].c);
if(++cnt%==) printf("\n");
// printf("(%d,%d)%c",nodes[i].r,nodes[i].c,++cnt%10?' ':'\n');
}
if(nodes.size()%!=) printf("\n");
} void solve(){
memset(d,-,sizeof(d));
queue<Node> q;
d[r1][r2][dir]=;
Node u(r1,c1,dir);
q.push(u);
while(!q.empty()){
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(d[v.r][v.c][i]<&&inside(v.r,v.c)&&has_edge[u.r][u.c][u.dir][i]){
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");
} int main(){
freopen("in.txt","r",stdin);
while(scanf("%s",name)){
memset(has_edge,,sizeof(has_edge));
if(strcmp(name,"END")==) break;
scanf("%d%d",&r0,&c0);
scanf("%s",&dir0);
scanf("%d%d",&r2,&c2);
dir=dir_id(dir0);
r1=r0+dr[dir];
c1=c0+dc[dir];
int pr,pc,pdir,pturn;
while(scanf("%d",&pr)&&pr){
scanf("%d",&pc);
while(scanf("%s",str)){
if(str[]=='*'){break;}
pdir=dir_id(str[]);
int len=strlen(str);
for(int i=;i<len;i++){
pturn=turn_id(str[i]);
has_edge[pr][pc][pdir][pturn]=;
}
}
}
cout<<name<<endl;
solve();
}
return ;
}

BFS求最短路 Abbottt's Revenge UVa 816的更多相关文章

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

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

  2. 图-用DFS求连通块- UVa 1103和用BFS求最短路-UVa816。

    这道题目甚长, 代码也是甚长, 但是思路却不是太难.然而有好多代码实现的细节, 确是十分的巧妙. 对代码阅读能力, 代码理解能力, 代码实现能力, 代码实现技巧, DFS方法都大有裨益, 敬请有兴趣者 ...

  3. UVa 816 (BFS求最短路)

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

  4. POJ 2251 Dungeon Master --- 三维BFS(用BFS求最短路)

    POJ 2251 题目大意: 给出一三维空间的地牢,要求求出由字符'S'到字符'E'的最短路径,移动方向可以是上,下,左,右,前,后,六个方向,每移动一次就耗费一分钟,要求输出最快的走出时间.不同L层 ...

  5. BFS求最短路

    假设有一个n行m列的迷宫,每个单位要么是空地(用1表示)要么是障碍物(用0表示).如和找到从起点到终点的最短路径?利用BFS搜索,逐步计算出每个节点到起点的最短距离,以及最短路径每个节点的前一个节点. ...

  6. 6.4.2 用BFS求最短路

    前面的篇幅占了太多,再次新开一章,讲述BFS求最短路的问题 注意此时DFS就没有BFS好用了,因为DFS更适合求全部解,而BFS适合求最优解 这边再次提醒拓扑变换的思想在图形辨认中的重要作用,需要找寻 ...

  7. 利用BFS求最短路

    利用BFS求图的最短路, POJ3984 #define _CRT_SECURE_NO_DEPRECATE #include<iostream> #include<string.h& ...

  8. hdu 3760(2次bfs求最短路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3760 思路:首先是建反图,从点n开始做spfa求出n到各点的最短路,然后从1点开始搜最小序列,对于边( ...

  9. CodeForces - 987D Fair (BFS求最短路)

    题意:有N个城市,M条双向道路连接两个城市,整个图保证连通.有K种物品,但每个城市只有一种,现在它们都需要S种物品来举办展览,可以去其他城市获取该城市的物品,花费是两城市之间的最短路径长度.求每个城市 ...

随机推荐

  1. Winsock网络编程笔记(3)----基于UDP的server和client

    在上一篇随笔中,对Winsock中基于tcp面向连接的Server和Client通信进行了说明,但是,Winsock中,Server和Client间还可以通过无连接通信,也就是采用UDP协议.. 因此 ...

  2. POJ3468(线段树 区间修改 lazy-tag)

    我的线段树真的没救了......还是多练几道吧....... You have N integers, A1, A2, ... , AN. You need to deal with two kind ...

  3. django 实现同一个ip十分钟内只能注册一次(redis版本)

    上一篇文章,django 实现同一个ip十分钟内只能注册一次 的时候,我们在注册的时候选择使用的使我们的数据库来报错我们的注册的ip信息,可是如果数据量大,用户多的时候,单单靠我们的数据库 来储存我们 ...

  4. indexed database IndexedDB

    Indexed Database API 目的是提供一个可供javascript存储和检索对象,并且还能进行查询,搜索等数据库操作   设计为几乎完全异步,因此绝大部分操作都稍后执行,因此每次操作都应 ...

  5. bzoj1001(对偶图最短路)

    显然是个最大流问题. 边数达到了10^6级别,显然用dinic算法会TLE 对于一个平面图来说,当然用对偶图的最短路来求最小割(最大流) SPFA转移的时候注意判断边界情况 应该要开longlong才 ...

  6. centos7.2构建Python3.5开发环境

    1.本次使用的是一台全新的腾讯云主机,首先获取linux系统版本信息. [root@VM_46_121_centos ~]# cat /etc/redhat-release <本系统默认自带py ...

  7. 一款基于vue2.0的分页组件---写在页面内

    通过 Vue2.0 实现的分页 可自由设置分页显示的多少.上一页.下一页.省略号等,也可直接输入跳转到的页码进行跳转,分页的样式可自由调整 // 1.页面的 head 部分,需要设计好页面的样式 .p ...

  8. linux操作系统基础篇(六)

    linux服务篇 1.samba服务的搭建 samba的功能: samba是一个网络服务器,用于Linux和Windows之间共享文件.2. samba服务的启动.停止.重启service smb s ...

  9. 基于HTML5 Canvas 点击添加 2D 3D 机柜模型

    今天又返回好好地消化了一下我们的数据容器 DataModel,这里给新手做一个典型的数据模型事件处理的例子作为参考.这个例子看起来很简单,实际上结合了数据模型中非常重要的三个事件处理的部分:属性变化事 ...

  10. python之列表(list)的使用方法介绍

    python之列表(list)介绍 在python的使用过程中,我们经常会用到列表,然而经常会遇到疑惑,下面我将详细介绍下列表使用方法. 一.列表 列表经常用到的功能使增.删.改和查功能. 1. 增 ...