UVa 816 (BFS求最短路)
/*816 - Abbott's Revenge
---代码完全参考刘汝佳算法入门经典
---strchr() 用来查找某字符在字符串中首次出现的位置,其原型为:char * strchr (const char *str, int c)
---BFS求最短路
--*/
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn = 10;
struct Node{int r, c, dir;Node(int a=0, int b=0, int c=0) :r(a), c(b), dir(c){}
};int dis[maxn][maxn][4];//dis[r][c][dir]保存状态(r,c,dir)到初始状态的距离
int id[256];
Node path[maxn][maxn][4]; //path[r][c][dir]保存了状态(r,c,dir)在BFS树中的父节点
int has[maxn][maxn][4][3];//has[r][c][dir][turn],表示当前处在(r,c,dir)状态是否可以向turn转弯
int r0, c0, r1, c1, r2, c2, dir;const int dr[] = { -1, 0, 1, 0 };
const int dc[] = { 0, 1, 0, -1 };//计算出下一个节点
Node walk(Node&u, int turn){//首先计算出下一步的朝向int dir = u.dir;if (turn == 1)dir = (dir + 3) % 4; //左转,逆时针if (turn == 2)dir = (dir + 1) % 4;//右转,顺时针return Node(u.r + dr[dir], u.c + dc[dir], dir);
}
bool insid(int r, int c){return r >= 1 && c >= 1 && r <= 9 && c <= 9;
}void print_ans(Node u){vector<Node>vec;while (dis[u.r][u.c][u.dir] != 0){vec.push_back(u);u = path[u.r][u.c][u.dir];}vec.push_back(u);vec.push_back(Node(r0, c0, dir));int cnt = 0;printf(" ");for (int i = vec.size() - 1; i >= 0; i--,cnt++){if (cnt){if (cnt% 10 == 0)printf("\n ");else printf(" ");}printf("(%d,%d)", vec[i].r, vec[i].c);}printf("\n");
}void bfs(){queue<Node>Q;Node u(r1, c1, dir);Q.push(u);memset(dis, -1, sizeof(dis));dis[r1][c1][dir] = 0;while (!Q.empty()){u = Q.front(); Q.pop();if (u.r == r2&&u.c == c2){ print_ans(u); return; }for (int i = 0; i < 3; i++){Node v = walk(u, i);if (has[u.r][u.c][u.dir][i] && insid(v.r, v.c) && dis[v.r][v.c][v.dir] < 0){path[v.r][v.c][v.dir] = u;dis[v.r][v.c][v.dir] = dis[u.r][u.c][u.dir] + 1;Q.push(v);}}}printf(" No Solution Possible\n");
}
int main(){//01234代表NESW,顺时针方向id['N'] = 0;id['E'] = 1;id['S'] = 2;id['W'] = 3;//012代表转向id['F'] = 0;id['L'] = 1;id['R'] = 2;char s1[21], s2[21];while (scanf("%s", s1)&&strcmp(s1,"END")){printf("%s\n", s1);scanf("%d%d%s%d%d", &r0, &c0, s2, &r2, &c2);dir = id[s2[0]];r1 = r0 + dr[dir];c1 = c0 + dc[dir];memset(has, 0, sizeof(has));int r, c;while (scanf("%d", &r) && r){scanf("%d", &c);while (scanf("%s", s1) && strcmp(s1, "*")){for (int i = 1; i < strlen(s1); i++){has[r][c][id[s1[0]]][id[s1[i]]] = 1;}}}bfs();}return 0;
}
转载于:https://www.cnblogs.com/td15980891505/p/5831157.html
UVa 816 (BFS求最短路)相关推荐
- *【ZOJ - 3781】Paint the Grid Reloaded(dfs求连通块缩点,bfs求最短路,建图技巧)
题干: Leo has a grid with N rows and M columns. All cells are painted with either black or white initi ...
- 算法提高课-图论-单源最短路的建图方式-AcWing 920. 最优乘车:bfs求最短路、建图
题目分析 来源:acwing 分析: 本题难在抽象建图上,这里采用的建图方式是:同一条公交线路上,前面的站点都可以连一条有向边到其后面的站点,且边权都为1. 由于边权都是1,可以用bfs来求最短路. ...
- AcWing 845. 八数码(3阶数字华容道):bfs求最短路,状态表示困难
文章目录 题目 题目分析 题目 题目链接:AcWing 845. 八数码(数字华容道) 在一个3×3的网格中,1~8这8个数字和一个"x"恰好不重不漏地分布在这3×3的网格中. 例 ...
- UVa1600 Patrol Robot (BFS求最短路进阶)
题目链接 A robot has to patrol around a rectangular area which is in a form of m × n grid (m rows and n ...
- Codeforces D. Fair 多源BFS求最短路
点击打开链接 D. Fair time limit per test 2 seconds memory limit per test 512 megabytes input standard inpu ...
- 魔戒-BFS求最短路
魔戒 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 蓝色空间号和万有引力号进入了四维水洼, ...
- 2018ACM-ICPC 焦作站现场赛 F. Honeycomb(BFS求最短路,卡memset)
F. Honeycomb 从前不信命,从这道题开始,我信了. 我就是没有拿牌子的命.这道题或者说这个memset,击碎了我所有对ACM的美好记忆. #include<bits/stdc++.h& ...
- Wappo BFS求最短路+路径记录
点击打开链接 描述 Einstein最近迷上了一款手机益智游戏Wappo,但是由于IQ和RP等诸多原因,他一直无法通关,他希望你编一个程序来玩这个游戏. Wappo的游戏规则是这样的:在一张m*n的地 ...
- CSP认证201703-4 地铁修建[C++题解]:连通路径上的最大边权最小、bfs求边权为1的最短路、二分查找
文章目录 题目解答 题目链接 题目解答 来源:acwing 分析: 题目给定n个点和m条边,要求最多选择n条边,使得1到n连通,然后每段路同时开工,求最小工时.换句话说,求的是连通路上最大边权最小. ...
最新文章
- 搞Java的年薪 40W 是什么水平?
- asp.net 2.0 技巧2
- 进程间通讯(一)--邮件槽
- 梯度与散度与拉普拉斯算子
- 使用R7版NDK搭建Android开发环境[不使用Cgywin]
- python抓取教学_Python Selenium 实战教学:爬取每日天气
- 190123每日一句
- Eclipse SVN提交代码ClientException异常解决
- ideaIU安装教程
- 马化腾致信合作伙伴:灰度法则的七个维度
- 科罗拉多大学波尔得分校计算机科学,科罗拉多大学波尔得分校计算机科学本科专业-(20页)-原创力文档...
- 无法连接数据库2003-cant connect to Mysql server on ‘localhost’(10038)
- 和“目标”相关的名言
- 书论94 梁同书《频罗庵论书》
- 微信小程序座位预约,微信小程序实现订座位,餐厅座位预约小程序毕设作品
- Cookie跨域setDomain
- 查表法求sin和cos
- layui教程,非常全,常用代码一键复制粘贴
- Arduino智能小车设计(二)
- Halcon学习(3)读取图片操作
热门文章
- string time java,【JAVA】之【string转time方法】
- php radius类,PHP Radius Search
- pythontkinter做计算器_Python Tkinter实现简易计算器功能
- oracle sql练习_使用Scrapy爬虫,并将数据存储到oracle
- leetcode - 198. 打家劫舍
- 贝叶斯分层回归模型的推理、EM求解和Java编程
- Gaussian LDA(高斯LDA)简介
- 搞懂多维高斯分布的由来
- 蔡高厅老师 - 高等数学阅读笔记 - 03 - 极限(13、14、15、16、17)
- 网络服务器监测系统,网络服务器监测系统研究与开发