UVa810
Posted yifeiwa
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVa810相关的知识,希望对你有一定的参考价值。
这道题不想说什么了,如果不能想出更好的解决方法的话,打表是个好东西!
// UVa 810 #include <cstdio> #include <iostream> #include <cstring> #include <string> #include <vector> #include <set> using namespace std; const int maxn = 10 + 5; int pic[7][7]; void init() pic[1][2] = 4; pic[1][3] = 2; pic[1][4] = 5; pic[1][5] = 3; pic[2][1] = 3; pic[2][3] = 6; pic[2][4] = 1; pic[2][6] = 4; pic[3][1] = 5; pic[3][2] = 1; pic[3][5] = 6; pic[3][6] = 2; pic[4][1] = 2; pic[4][2] = 6; pic[4][5] = 1; pic[4][6] = 5; pic[5][1] = 4; pic[5][3] = 1; pic[5][4] = 6; pic[5][6] = 3; pic[6][2] = 3; pic[6][3] = 5; pic[6][4] = 2; pic[6][5] = 4; int n, m, a, b, t, f; int G[maxn][maxn]; struct Node int x, y, top, face, root; Node(int x=0, int y=0, int top=0, int face=0, int root=0) : x(x), y(y), top(top), face(face), root(root) bool operator < (Node b) const if (x != b.x) return x < b.x; if (y != b.y) return y < b.y; if (top != b.top) return top < b.top; return face < b.face; bool isVis() const return x >= 1 && x <= n && y >= 1 && y <= m && G[x][y] != 0; ; int cnt; set<Node> Set; vector<Node> Ans; void findnode(Node u, int rem) int x1, y1, t, f, l; x1 = u.x; y1 = u.y; t = u.top; f = u.face; l = pic[t][f]; Node a1(x1, y1-1, 7-l, f, rem); if (a1.isVis() && !Set.count(a1) && (G[x1][y1-1] == -1 || G[x1][y1-1] == t)) Set.insert(a1); Ans.push_back(a1); Node a2(x1, y1+1, l, f, rem); if (a2.isVis() && !Set.count(a2) && (G[x1][y1+1] == -1 || G[x1][y1+1] == t)) Set.insert(a2); Ans.push_back(a2); Node a3(x1-1, y1, f, 7-t, rem); if (a3.isVis() && !Set.count(a3) && (G[x1-1][y1] == -1 || G[x1-1][y1] == t)) Set.insert(a3); Ans.push_back(a3); Node a4(x1+1, y1, 7-f, t, rem); if (a4.isVis() && !Set.count(a4) && (G[x1+1][y1] == -1 || G[x1+1][y1] == t)) Set.insert(a4); Ans.push_back(a4); bool bfs() Node v(a, b, t, f, -1); Ans.push_back(v); while (cnt < Ans.size()) Node u = Ans[cnt++]; // cout << u.x << " " << u.y << " " << u.top << " " << u.face << endl; if (u.x == a && u.y == b && cnt-1) return true; findnode(u, cnt-1); return false; int count, flag; void DG(int num) if (Ans[num].root != -1) DG(Ans[num].root); ++count; count %= 10; if (flag) printf(","); else printf(" "); flag = 1; if (count == 0) printf("\n"); printf(" "); count = 1; printf("(%d,%d)", Ans[num].x, Ans[num].y); int main() init(); string str; while (cin >> str && str != "END") cout << str << "\n"; cin >> n >> m >> a >> b >> t >> f; for (int i = 1; i <= n; ++i) for (int j = 1; j <= m; ++j) cin >> G[i][j]; cnt = 0; Set.clear(); Ans.clear(); if (bfs()) count = flag = 0; DG(cnt-1); printf("\n"); else printf(" No Solution Possible\n"); return 0;
以上是关于UVa810的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode810. 黑板异或游戏/455. 分发饼干/剑指Offer 53 - I. 在排序数组中查找数字 I/53 - II. 0~n-1中缺失的数字/54. 二叉搜索树的第k大节点(代码片段
LeetCode篇:810 黑板异或游戏(JavaScript版)
LeetCode篇:810 黑板异或游戏(JavaScript版)