/*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求最短路)相关推荐

  1. *【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 ...

  2. 算法提高课-图论-单源最短路的建图方式-AcWing 920. 最优乘车:bfs求最短路、建图

    题目分析 来源:acwing 分析: 本题难在抽象建图上,这里采用的建图方式是:同一条公交线路上,前面的站点都可以连一条有向边到其后面的站点,且边权都为1. 由于边权都是1,可以用bfs来求最短路. ...

  3. AcWing 845. 八数码(3阶数字华容道):bfs求最短路,状态表示困难

    文章目录 题目 题目分析 题目 题目链接:AcWing 845. 八数码(数字华容道) 在一个3×3的网格中,1~8这8个数字和一个"x"恰好不重不漏地分布在这3×3的网格中. 例 ...

  4. 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 ...

  5. Codeforces D. Fair 多源BFS求最短路

    点击打开链接 D. Fair time limit per test 2 seconds memory limit per test 512 megabytes input standard inpu ...

  6. 魔戒-BFS求最短路

    魔戒 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 蓝色空间号和万有引力号进入了四维水洼, ...

  7. 2018ACM-ICPC 焦作站现场赛 F. Honeycomb(BFS求最短路,卡memset)

    F. Honeycomb 从前不信命,从这道题开始,我信了. 我就是没有拿牌子的命.这道题或者说这个memset,击碎了我所有对ACM的美好记忆. #include<bits/stdc++.h& ...

  8. Wappo BFS求最短路+路径记录

    点击打开链接 描述 Einstein最近迷上了一款手机益智游戏Wappo,但是由于IQ和RP等诸多原因,他一直无法通关,他希望你编一个程序来玩这个游戏. Wappo的游戏规则是这样的:在一张m*n的地 ...

  9. CSP认证201703-4 地铁修建[C++题解]:连通路径上的最大边权最小、bfs求边权为1的最短路、二分查找

    文章目录 题目解答 题目链接 题目解答 来源:acwing 分析: 题目给定n个点和m条边,要求最多选择n条边,使得1到n连通,然后每段路同时开工,求最小工时.换句话说,求的是连通路上最大边权最小. ...

最新文章

  1. 搞Java的年薪 40W 是什么水平?
  2. asp.net 2.0 技巧2
  3. 进程间通讯(一)--邮件槽
  4. 梯度与散度与拉普拉斯算子
  5. 使用R7版NDK搭建Android开发环境[不使用Cgywin]
  6. python抓取教学_Python Selenium 实战教学:爬取每日天气
  7. 190123每日一句
  8. Eclipse SVN提交代码ClientException异常解决
  9. ideaIU安装教程
  10. 马化腾致信合作伙伴:灰度法则的七个维度
  11. 科罗拉多大学波尔得分校计算机科学,科罗拉多大学波尔得分校计算机科学本科专业-(20页)-原创力文档...
  12. 无法连接数据库2003-cant connect to Mysql server on ‘localhost’(10038)
  13. 和“目标”相关的名言
  14. 书论94 梁同书《频罗庵论书》
  15. 微信小程序座位预约,微信小程序实现订座位,餐厅座位预约小程序毕设作品
  16. Cookie跨域setDomain
  17. 查表法求sin和cos
  18. layui教程,非常全,常用代码一键复制粘贴
  19. Arduino智能小车设计(二)
  20. Halcon学习(3)读取图片操作

热门文章

  1. string time java,【JAVA】之【string转time方法】
  2. php radius类,PHP Radius Search
  3. pythontkinter做计算器_Python Tkinter实现简易计算器功能
  4. oracle sql练习_使用Scrapy爬虫,并将数据存储到oracle
  5. leetcode - 198. 打家劫舍
  6. 贝叶斯分层回归模型的推理、EM求解和Java编程
  7. Gaussian LDA(高斯LDA)简介
  8. 搞懂多维高斯分布的由来
  9. 蔡高厅老师 - 高等数学阅读笔记 - 03 - 极限(13、14、15、16、17)
  10. 网络服务器监测系统,网络服务器监测系统研究与开发