UVa816 Abbott的复仇

来源:互联网 发布:mac 系统使用 编辑:程序博客网 时间:2024/04/28 02:15
#include <iostream>#include <algorithm>#include <string>#include <queue>#include <vector>using namespace std;const int maxn = 10;const char* dirs = "NESW"; //进入的四个方向;const char* turns = "FLR"; //可以转向的三种方式;const int dr[] = { -1, 0, 1, 0 };const int dc[] = { 0, 1, 0, -1 }; //两个转向辅助数组;int r0, c0, r1, c1, r2, c2, dir;//定义点结构;struct Node {int r, c, dir;Node(int r = NULL, int c = NULL, int dir = NULL) : r(r), c(c), dir(dir) {};};int has_edge[maxn][maxn][4][3]; //记录以某方向进入某点向某方向转向是否可行;int d[maxn][maxn][4]; //记录是否走过Node p[maxn][maxn][4]; //记录走过的点的上一个节点,即父节点,原因下面代码自己领悟;//将输入的"NESW"转换为数字表示的函数;int dir_id(char c) {return strchr(dirs, c) - dirs;}int turn_id(char c) {return strchr(turns, c) - turns;}//行走函数,计算下一步的情况,turn = 0为直走, turn = 1 或 2 为转弯;Node walk(const 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 inside(int r, int c) {return r >= 1 && r <= 9 && c >= 1 && c <= 9;}//输入函数;bool read_case() {char s1[99], s2[99];if (scanf("%s%d%d%s%d%d", s1, &r0, &c0, s2, &r2, &c2) != 6) return false;printf("%s\n", s1);dir = dir_id(s2[0]);r1 = r0 + dr[dir];c1 = c0 + dc[dir];memset(has_edge, 0, sizeof(has_edge));for (;;) {int r, c;scanf("%d", &r);if (r == 0) break;scanf("%d", &c);while (scanf("%s", s1) == 1 && s1[0] != '*') {int q = strlen(s1);for (int i = 1; i < q; i++) {has_edge[r][c][dir_id(s1[0])][turn_id(s1[i])] = 1; //标记可行点;}}}return true;}//输出函数;void print_ans(Node u) {vector<Node> nodes;for (;;) {nodes.push_back(u);if (d[u.r][u.c][u.dir] == 0) break;u = p[u.r][u.c][u.dir];}nodes.push_back(Node(r0, c0, dir));int cnt = 0;for (int i = nodes.size() - 1; i >= 0; i--) {if (cnt % 10 == 0) printf(" ");printf(" (%d,%d)", nodes[i].r, nodes[i].c);if (++cnt % 10 == 0) printf("\n");}if (nodes.size() % 10 != 0)printf("\n");}//BFS;void solve() {queue<Node> q;Node u(r1, c1, dir);q.push(u);memset(d, -1, sizeof(d));d[u.r][u.c][u.dir] = 0;while (!q.empty()) {Node 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_edge[u.r][u.c][u.dir][i] && inside(v.r, v.c) && d[v.r][v.c][v.dir] < 0) {d[v.r][v.c][v.dir] = d[u.r][u.c][u.dir] + 1;p[v.r][v.c][v.dir] = u;q.push(v);}}}printf("  No Solution Possible\n");}int main() {while (read_case()) {solve();}return 0;}

0 0
原创粉丝点击