經典推箱子遊戲簡化版:M×N 房間(2≤M,N≤7),有牆壁(1)、箱子(2)、目標(3)、搬運工(4)、空地(0)。搬運工只能推箱子不能拉。箱子推入死角則無法移動,推靠牆只能沿牆移動。求最少推動格數,不可達輸出 -1。
vis[box_x][box_y][dir] 記錄箱子在某位置向某方向是否已推過
#include <iostream>
#include <cstring>
#include <queue>
#include <cstdio>
using namespace std;
int Map[8][8];
bool vis[8][8][4], us[8][8]; // 箱子推過方向、人走過點
int dir[4][2] = {{0,1},{0,-1},{1,0},{-1,0}};
struct Node {
int x, y; // 箱子坐標
int xx, yy; // 人坐標
int t; // 推動次數
} st, ed;
struct Pos { int x, y; } a, b;
int n, m;
queue<Node> q;
void Bfs() {
// 外層 BFS:箱子狀態
// 內層 BFS:人能否到達推箱位置
// 詳見完整代碼...
}
int main() {
int T; cin >> T;
while (T--) {
cin >> n >> m;
memset(Map, 0, sizeof(Map));
// 讀入地圖,記錄箱子、人、目標初始位置
// 初始化 vis、調用 Bfs()
}
return 0;
}
vis[8][8][4] 標記箱子在 (x,y) 向方向 d 推過us 數組(人走過標記)