uva 816 BFS求最短路的经典问题……
一开始情况没有考虑周全,直接WA掉了,
然后用fgets()出现了WA,给改成scanf就AC了
题目不是很难,用心就好……
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <stack>
#include <cctype>
#include <string>
#include <malloc.h>
#include <queue>
#include <map> using namespace std;
const int INF = 0xffffff;
const double Pi = * atan();
const int Maxn = + ;
//int dir2[8][2] = {{-1,0},{0,-1},{-1,1},{1,-1},{-1,-1},{1,0},{0,1},{1,1}};
int dr[] = {-,,,};
int dc[] = {,,,-}; struct Node{
int r;
int c;
int dir;
Node(int rr,int cc,int dd){
r = rr;
c = cc;
dir = dd;
}
Node(){}
};
const char * dirs = "NESW";
const char * turns = "FLR";
bool has_edge[][][][];
int d[][][];
int r1,c1,dir;
int r0,c0;
int r2,c2;
bool flag;
Node p[][][]; int dir_id(char ch){
return strchr(dirs,ch) - dirs;
}
int turn_id(char ch){
return strchr(turns,ch) - turns;
} Node walk(Node & u,int turn){
int dd = u.dir;
if(turn == ){
dd = (dd + ) % ;
}
else if(turn == ){
dd = (dd + ) % ;
}
return Node(u.r + dr[dd],u.c + dc[dd],dd);
} void print_ans(Node u){
vector<Node>nodes;
while(){
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 << " ";
cout << " (" << nodes[i].r << "," << nodes[i].c << ")";
if(++cnt % == )
cout << endl;
}
if(nodes.size() % != )
cout << endl;
} bool inside(int r,int c){
if(r > && r < && c > && c < )
return true;
return false;
} void solve(){
queue<Node>q;
memset(d,-,sizeof(d));
memset(p,,sizeof(p));
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){
flag = ;
print_ans(u);
return;
}
for(int i = ;i < ;i++){
Node v = walk(u,i);
if(has_edge[u.r][u.c][u.dir][i] && inside(v.r,v.c) && d[v.r][v.c][v.dir] < ){
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);
}
}
}
} int main()
{
#ifndef ONLINE_JUDGE
freopen("inpt.txt","r",stdin);
#endif
char str[];
while(~scanf("%s",str) && strcmp(str,"END")){
printf("%s\n",str);
flag = ;
memset(has_edge,,sizeof(has_edge));
char ch;
cin >> r0 >> c0 >> ch >> r2 >> c2;
dir = dir_id(ch);
r1 = r0 + dr[dir];
c1 = c0 + dc[dir];
int r,c;
char str2[]; while(cin >> r){
if(r == ){
break;
}
cin >> c;
while(cin >> str2){
if(str2[] == '*')
break;
int dirID = dir_id(str2[]);
int len = strlen(str2);
for(int i = ;i < len;i++){
int turnID = turn_id(str2[i]);
has_edge[r][c][dirID][turnID] = ;
}
}
}
solve();
if(flag){
cout << " No Solution Possible" << endl;
}
getchar();
}
return ;
}
测试数据:
SAMPLE
N
WL NR *
WLF NR ER *
NL ER *
SL WR NF *
SL WF ELF *
SFR EL * NOSOLUTION
N
WL NR *
NL ER *
SL WR NFR *
SR EL * MyMaze
N MyMaze
N MyMaze
N MyMaze
W
NR *
ER *
WR *
SF * MyMaze
N
WL *
NL *
SF *
NR *
SL *
EL * Circle
N
NR *
ER *
SF *
WR *
SR * Robert Abbott's Atlanta Maze
N
NR WL *
NLR WF EFR *
EFR WFR NL *
ER NL *
SFL WL NFR *
EL SFLR WFRL NFL *
EFLR SF NF WFRL *
SR ELR NF *
WR SL *
EFL SLR WR NF *
EFL SLR WL *
EL SR * END
SAMPLE
(,) (,) (,) (,) (,) (,) (,) (,) (,) (,)
(,) (,) (,) (,) (,)
NOSOLUTION
No Solution Possible
MyMaze
No Solution Possible
MyMaze
No Solution Possible
MyMaze
(,) (,)
MyMaze
(,) (,) (,) (,) (,) (,)
MyMaze
(,) (,) (,) (,) (,) (,) (,) (,)
Circle
(,) (,) (,) (,) (,) (,) (,)
Robert Abbott's Atlanta Maze
(,) (,) (,) (,) (,) (,) (,) (,) (,) (,)
(,) (,) (,) (,) (,) (,) (,) (,) (,) (,)
uva 816 BFS求最短路的经典问题……的更多相关文章
- UVa 816 (BFS求最短路)
/*816 - Abbott's Revenge ---代码完全参考刘汝佳算法入门经典 ---strchr() 用来查找某字符在字符串中首次出现的位置,其原型为:char * strchr (cons ...
- UVA 816 -- Abbott's Revenge(BFS求最短路)
UVA 816 -- Abbott's Revenge(BFS求最短路) 有一个 9 * 9 的交叉点的迷宫. 输入起点, 离开起点时的朝向和终点, 求最短路(多解时任意一个输出即可).进入一个交叉 ...
- 图-用DFS求连通块- UVa 1103和用BFS求最短路-UVa816。
这道题目甚长, 代码也是甚长, 但是思路却不是太难.然而有好多代码实现的细节, 确是十分的巧妙. 对代码阅读能力, 代码理解能力, 代码实现能力, 代码实现技巧, DFS方法都大有裨益, 敬请有兴趣者 ...
- 6.4.2 用BFS求最短路
前面的篇幅占了太多,再次新开一章,讲述BFS求最短路的问题 注意此时DFS就没有BFS好用了,因为DFS更适合求全部解,而BFS适合求最优解 这边再次提醒拓扑变换的思想在图形辨认中的重要作用,需要找寻 ...
- POJ 2251 Dungeon Master --- 三维BFS(用BFS求最短路)
POJ 2251 题目大意: 给出一三维空间的地牢,要求求出由字符'S'到字符'E'的最短路径,移动方向可以是上,下,左,右,前,后,六个方向,每移动一次就耗费一分钟,要求输出最快的走出时间.不同L层 ...
- BFS求最短路
假设有一个n行m列的迷宫,每个单位要么是空地(用1表示)要么是障碍物(用0表示).如和找到从起点到终点的最短路径?利用BFS搜索,逐步计算出每个节点到起点的最短距离,以及最短路径每个节点的前一个节点. ...
- 利用BFS求最短路
利用BFS求图的最短路, POJ3984 #define _CRT_SECURE_NO_DEPRECATE #include<iostream> #include<string.h& ...
- hdu 3760(2次bfs求最短路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3760 思路:首先是建反图,从点n开始做spfa求出n到各点的最短路,然后从1点开始搜最小序列,对于边( ...
- CodeForces - 987D Fair (BFS求最短路)
题意:有N个城市,M条双向道路连接两个城市,整个图保证连通.有K种物品,但每个城市只有一种,现在它们都需要S种物品来举办展览,可以去其他城市获取该城市的物品,花费是两城市之间的最短路径长度.求每个城市 ...
随机推荐
- redis(五)redis与Mybatis的无缝整合让MyBatis透明的管理缓存二
在上一篇文中的Cahe类存在各种问题如:一直使用同一个连接,每次都创建新的Cache,项目中老是爆出connection timeout 的异常,存储的key过长等等一系列的问题,解决问题最好的办法就 ...
- 利用SolrJ操作solr API完成index操作
使用SolrJ操作Solr会比利用httpClient来操作Solr要简单.SolrJ是封装了httpClient方法,来操作solr的API的.SolrJ底层还是通过使用httpClient中的方法 ...
- 网络爬虫 kamike.collect
Another Simple Crawler 又一个网络爬虫,可以支持代理服务器的FQ爬取. 1.数据存在mysql当中. 2.使用时,先修改web-inf/config.ini的数据链接相关信息,主 ...
- uva - Broken Keyboard (a.k.a. Beiju Text)(链表)
11988 - Broken Keyboard (a.k.a. Beiju Text) You’re typing a long text with a broken keyboard. Well i ...
- location.href使用方法总结
javascript中的location.href有非常多种使用方法,主要例如以下. self.location.href="/url" 当前页面打开URL页面 location. ...
- 开源的Android视频播放器
之前尝试自己解码视频,然后播放显示,虽然音视频都可以播放,但是实现不了音视频的同步,所以使用第三方的视频库Vitamio来实现视频播放器功能,这样自己只需要实现播放解码的制作不不要关心底层解码和显示问 ...
- saltstack:使用教程之一安装及客户端返回写入MySQL
saltstack使用教程: 1.安装: 需要epel的yum源,没有的话把下面的复制并新建个文件 /etc/yum.repos.d/epel.repo 粘贴即可: [epel] name=Extra ...
- 玩转Windows服务系列汇总(9篇文章)
玩转Windows服务系列汇总 创建Windows服务Debug.Release版本的注册和卸载及其原理无COM接口Windows服务启动失败原因及解决方案服务运行.停止流程浅析Windows服务小技 ...
- cocos2d-x游戏开发系列教程-坦克大战游戏之坦克和地图碰撞的检测下
上篇我们完成了地图的信息获取和碰撞检测,这篇我们整合到程序中. 在这之前我们改造一下Tank类,使它更加模块化,共容易理解: 1.改造后的Tank类声明如下: class Tank : public ...
- 织梦sitemap模板获取文章列表
分析了一下makehtml_map.php?dopost=site这个文件,发现生成视图用的是dedetag.class.php文件,有点简单.不能使用织梦的很多标签,例如: {dede:arclis ...