UVA 589 - Pushing Boxes(BFS+状态判重) 2021-12-27 题目链接:589 - Pushing Boxes 题意:就是模拟推箱子游戏,要求推箱子次数最少,然后是总次数最少的方案。 思路:广搜+状态判重,用人的位置和箱子位置和当前步数作为状态。然后由于是要优先推箱子次数少,所以利用优先队列去取状态。 代码: #include #include #include #include #include #include #include #define INF 0x3f3f3f3f using namespace std; const int d[4][2] = {{-1, 0}, {1, 0}, {0, 1}, {0, -1}}; const char s1[10] = "NSEW"; const char s2[10] = "nsew"; const int N = 25; int r, c, push_num; char g[N][N]; string ans; map vis[20][20][20][20]; typedef pair pi; pi s, b, t; struct State { int sx, sy, bx, by, num; string path; State() {} State(int _sx, int _sy, int _bx, int _by, int _num) { sx = _sx; sy = _sy; bx = _bx; by = _by; num = _num; path = ""; } friend bool operator < (State a, State b) { if (a.num != b.num) return a.num > b.num; return a.path.length() > b.path.length(); } }; void init() { ans = ""; push_num = INF; for (int i = 0; i < r; i++) { scanf("%s", g[i]); for (int j = 0; j < c; j++) { if (g[i][j] == 'S') s = make_pair(i, j); else if (g[i][j] == 'B') b = make_pair(i, j); else if (g[i][j] == 'T') t = make_pair(i, j); if (g[i][j] != '#') g[i][j] = '.'; for (int k = 0; k < r; k++) for (int l = 0; l < c; l++) vis[i][j][k][l].clear(); } } }bool check(int x, int y) { if (x < 0 || x >= r || y < 0 || y >= c || g[x][y] != '.') return false; return true; }void solve() { priority_queue Q; vis[s.first][s.second][b.first][b.second][0] = 1; Q.push(State(s.first, s.second, b.first, b.second, 0)); while (!Q.empty()) { State p = Q.top(); Q.pop(); if (p.bx == t.first && p.by == t.second) { if (push_num > p.num) { ans = p.path; push_num = p.num; } else if (push_num == p.num) { if (ans.length() > p.path.length()) ans = p.path; } else break; continue; } for (int i = 0; i < 4; i++) { State q = p; q.sx += d[i][0]; q.sy += d[i][1]; if (!check(q.sx, q.sy)) continue; q.path += s2[i]; if (q.sx == q.bx && q.sy == q.by) { q.bx += d[i][0], q.by += d[i][1]; if (!check(q.bx, q.by)) continue; q.num++; if (q.num > push_num) continue; q.path[q.path.length() - 1] = s1[i]; } if (vis[q.sx][q.sy][q.bx][q.by][ans.length()]) continue; vis[q.sx][q.sy][q.bx][q.by][ans.length()] = true; Q.push(q); } } }int main() { int cas = 0; while (~scanf("%d%d", &r, &c) && r || c) { init(); printf("Maze #%d\n", ++cas); solve(); if (ans.length()) cout << ans << endl; else printf("Impossible.\n"); printf("\n"); } return 0; } 【UVA 589 - Pushing Boxes(BFS+状态判重)】 推荐阅读 民办大学的学历在哪查询 隔13年首回归出演《半生缘》 佳能单反取景器 佳能光学取景器参数 洗碗机积水怎么放掉 洗碗机积水的解决方法 没蒸熟的米放冰箱里可以吗 蒸好的米在冰箱可以放多久 王爷和丞相谁的权利大?为什么? 奶茶妹妹再战时装周、一身全黑唇色亮眼,跟过去比有进步吗? 什么是藜麦 橡子能不能吃 毽子操真的可以瘦肚子吗 疑惑的意思 迷惑的意思 mongodb导入bson mongodb导入表数据 花蛤海苔汤——促进代谢降血脂 削了皮的茄子如何保存 迅捷pdf转换成ppt转换器 迅捷PDF转换器将PDF文件转为PPT幻灯片的详细教程 黄芩怎么繁殖 黄芩怎么种 一年级大小多少板书 一年级语文《大小多少》 理科文科分别是哪几科 养铜钱草哪些是要注意的 铜钱草土培怎么养 地板砖用无缝还是有缝好?无缝有缝各有哪些优缺点? 5899|5899 08days作业#姚安小红书裂变涨粉训练营# UVA 10763 729uva海明距离问题 搜索技术|UVA10054 The Necklace——欧拉回路(DFS) 四分树( Quadtrees, UVa 297) UVA 108 Maximum Sum (最大子矩阵和) POJ 1050 ACM|Pushing Boxes (poj 1475 嵌套bfs) UVa, 11000 Bee POJ 1475 Pushing Boxes POJ - 1475 Pushing Boxes