习题6-12 筛子难题(A Dicey Problem, ACM/ICPC World Finals 1999, UVa810)
2017-10-11 19:16
483 查看
0. bfs迷宫求解的题。只不过这题状态多了两种,依旧是水题。
1. 记录下由色子的上前到右的映射,且对面的点数和为7。
2. 起点相同,入队列的判定要做出一点改变 (dis <= 0)。
3. 为了减少首坐标的输出特判,可以在输出name时先不输出换行。
1. 记录下由色子的上前到右的映射,且对面的点数和为7。
2. 起点相同,入队列的判定要做出一点改变 (dis <= 0)。
3. 为了减少首坐标的输出特判,可以在输出name时先不输出换行。
#include <iostream> #include <string> #include <vector> #include <stack> #include <queue> #include <deque> #include <set> #include <map> #include <algorithm> #include <sstream> #include <utility> #include <cstring> #include <cstdio> #include <cstdlib> #include <ctime> #include <cmath> #include <cctype> #define CLEAR(a, b) memset(a, b, sizeof(a)) #define IN() freopen("in.txt", "r", stdin) #define OUT() freopen("out.txt", "w", stdout) #define LL long long #define maxn 15 #define maxm 100005 #define mod 1000000007 #define INF 1000000007 #define eps 1e-5 #define PI 3.1415926535898 #define N 26 using namespace std; //-------------------------CHC------------------------------// int n, m; struct Node { int r, c; int t, f; Node(int r = 0, int c = 0, int t = 0, int f = 0) : r(r), c(c), t(t), f(f) { } }; Node s; int G[maxn][maxn]; int r[7][7]; int d[maxn][maxn][7][7]; Node p[maxn][maxn][7][7]; const int dx[] = { -1, 1, 0, 0 }; const int dy[] = { 0, 0, -1, 1 }; bool inside(Node u) { return u.r >= 1 && u.c >= 1 && u.r <= n && u.c <= m; } bool same(Node u) { return u.r == s.r && u.c == s.c; } Node walk(Node u, int i) { Node v(u.r + dx[i], u.c + dy[i]); if (i == 0) v.t = u.f, v.f = 7 - u.t; else if (i == 1) v.t = 7 - u.f, v.f = u.t; else if (i == 2) v.t = r[u.t][u.f], v.f = u.f; else v.t = 7 - r[u.t][u.f], v.f = u.f; return v; } void print(Node u) { vector<pair<int, int>> v; bool first = true; for (;;) { v.push_back(make_pair(u.r, u.c)); if (u.r == s.r && u.c == s.c) { if (first) first = false; else break; } u = p[u.r][u.c][u.t][u.f]; } for (int i = v.size() - 1, cnt = 0; i >= 0; --i, ++cnt) { if (cnt % 9 == 0) printf("\n "); printf("(%d,%d)", v[i].first, v[i].second); if (i) putchar(','); } puts(""); } void bfs() { CLEAR(d, -1); queue<Node> q; q.push(s); d[s.r][s.c][s.t][s.f] = 0; bool first = true; while (q.size()) { Node u = q.front(); q.pop(); if (first) first = false; else if (same(u)) { print(u); return; } for (int i = 0; i < 4; ++i) { Node v = walk(u, i); if (inside(v) && d[v.r][v.c][v.t][v.f] <= 0 && (u.t == G[v.r][v.c] || G[v.r][v.c] == -1)) { d[v.r][v.c][v.t][v.f] = d[u.r][u.c][u.t][u.f] + 1; p[v.r][v.c][v.t][v.f] = u; q.push(v); } } } puts("\n No Solution Possible"); } int main() { r[1][2] = r[2][6] = r[6][5] = r[5][1] = 3; r[1][3] = r[3][6] = r[6][4] = r[4][1] = 5; r[2][3] = r[3][5] = r[5][4] = r[4][2] = 1; r[2][1] = r[6][2] = r[5][6] = r[1][5] = 4; r[3][1] = r[6][3] = r[4][6] = r[1][4] = 2; r[3][2] = r[5][3] = r[4][5] = r[2][4] = 6; char name[25]; while (~scanf("%s", name) && strcmp(name, "END")) { CLEAR(G, 0); scanf("%d%d%d%d%d%d", &n, &m, &s.r, &s.c, &s.t, &s.f); for (int i = 1; i <= n; ++i) for (int j = 1; j <= m; ++j) scanf("%d", &G[i][j]); printf("%s", name); bfs(); } return 0; }
相关文章推荐
- 习题6-13 电子表格计算器(Spreadsheet Calculator, ACM/ICPC World Finals 1992, UVa215)
- 习题7-1 消防车(Firetruck, ACM/ICPC World Finals 1991, UVa208)
- 习题6-8 空间结构(Spatial Structures, ACM/ICPC World Finals 1998, UVa806)
- 习题7-2 黄金图形(Golygons, ACM/ICPC World Finals 1993, UVa225)
- 习题6-7 Petri网模拟(Petri Net Simulation, ACM/ICPC World Finals 1998, UVa804)
- 习题3-8 循环小数(Repeating Decimals, ACM/ICPC World Finals 1990, UVa202)
- 习题7-4 切断圆环链(Cutting Chains, ACM/ICPC World Finals 2000, UVa818)
- 习题3-6 纵横字谜的答案(Crossword Answers, ACM/ICPC World Finals 1994, UVa232)
- 习题7-3 多米诺效应(The Domino Effect, ACM/ICPC World Finals 1991, UVa211)
- UVa806 习题6-8 空间结构(Spatial Structures,ACM/ICPC World Finals 1998)
- 算法竞赛入门经典-习题3-6 纵横字谜的答案(Crossword Answers, ACM/ICPC World Finals 1994,UVa232)
- Crossword Answers, ACM/ICPC World Finals 1994, UVa232
- 纵横字谜的答案(Crossword Answer,ACM/ICPC WOrld Finals 1994, UVa 232)
- 【DP 训练】Stamps and Envelope Size, ACM/ICPC World Finals 1995, UVa242
- ACM - ICPC World Finals 2013 D Factors
- 习题6-14 检查员的难题(Inspector's Dilemma, ACM/ICPC Dhaka 2007, UVa12118)
- UVa #810 A Dicey Problem (习题6-12)
- Message dicoding, ACM/ICPC World Finals 1991, UVa 213
- ACM/ICPC World Finals 2013 F Low Power
- ACM - ICPC World Finals 2013 F Low Power