题目
一张n*n的格子图,上面有空地、障碍物、三个出口和三个小人;每次一条指令让他们往四个方向移动一格,不能动的原地不动,动的就移动一格;一个格子上最多同时只有一个人
思路
暴力bfs
const int dx[] = {0, -1, 0, 1};
const int dy[] = {1, 0, -1, 0};
bool mark[11][11][11][11][11][11];
char mp[12][12];
int n;
struct node {
ii o1, o2, o3;
int t;
node(ii _a, ii _b, ii _c, int _t) {
o1 = _a;
o2 = _b;
o3 = _c;
t = _t;
}
};
queue<node> que;
void setmark(ii t1, ii t2, ii t3) {
mark[t1.first][t1.second][t2.first][t2.second][t3.first][t3.second] = true;
}
bool check(int x, int y) {
return (x >= 1 && x <= n && y >= 1 && y <= n && mp[x][y] != '#');
}
int bfs(ii& t1, ii& t2, ii& t3) {
while(!que.empty()) que.pop();
memset(mark, false, sizeof mark);
que.push(node(t1, t2, t3, 0));
setmark(t1, t2, t3);
int ans = -1;
while(!que.empty()) {
node now = que.front();
que.pop();
int x1 = now.o1.first, y1 = now.o1.second;
int x2 = now.o2.first, y2 = now.o2.second;
int x3 = now.o3.first, y3 = now.o3.second;
int t = now.t;
if (mp[x1][y1] == 'X' && mp[x2][y2] == 'X' && mp[x3][y3] == 'X') {
ans = t;
break;
}
for (int i = 0;i < 4;++i) {
bool flag1 = false, flag2 = false, flag3 = false;
int _x1 = x1 + dx[i];
int _y1 = y1 + dy[i];
if (!check(_x1, _y1)) {
_x1 = x1;
_y1 = y1;
flag1 = true;
}
int _x2 = x2 + dx[i];
int _y2 = y2 + dy[i];
if (!check(_x2, _y2)) {
_x2 = x2;
_y2 = y2;
flag2 = true;
}
int _x3 = x3 + dx[i];
int _y3 = y3 + dy[i];
if (!check(_x3, _y3)) {
_x3 = x3;
_y3 = y3;
flag3 = true;
}
if (flag1 && flag2 && flag3) {
if (mark[_x1][_y1][_x2][_y2][_x3][_y3]) continue;
mark[_x1][_y1][_x2][_y2][_x3][_y3] = true;
que.push(node(ii(_x1, _y1), ii(_x2, _y2), ii(_x3, _y3), t + 1));
}else {
while (1) {
bool flag = 0;
if (!flag1 && flag2 && _x1 == _x2 && _y1 == _y2) {
_x1 = x1, _y1 = y1;
flag1 = 1;
flag = 1;
}
if (flag1 && !flag2 && _x1 == _x2 && _y1 == _y2) {
_x2 = x2, _y2 = y2;
flag2 = 1;
flag = 1;
}
if (!flag1 && flag3 && _x1 == _x3 && _y1 == _y3) {
_x1 = x1, _y1 = y1;
flag1 = 1;
flag = 1;
}
if (flag1 && !flag3 && _x1 == _x3 && _y1 == _y3) {
_x3 = x3, _y3 = y3;
flag3 = 1;
flag = 1;
}
if (!flag2 && flag3 && _x2 == _x3 && _y2 == _y3) {
_x2 = x2, _y2 = y2;
flag2 = 1;
flag = 1;
}
if (flag2 && !flag3 && _x2 == _x3 && _y2 == _y3) {
_x3 = x3, _y3 = y3;
flag3 = 1;
flag = 1;
}
if (!flag) {
break;
}
}
if (mark[_x1][_y1][_x2][_y2][_x3][_y3]) {
continue;
}
mark[_x1][_y1][_x2][_y2][_x3][_y3] = true;
que.push(node(ii(_x1, _y1), ii(_x2, _y2), ii(_x3, _y3), t + 1));
}
}
}
return ans;
}
int main(int argc, const char * argv[])
{
// freopen("/Users/jamesqi/Desktop/in.txt","r",stdin);
// freopen("/Users/jamesqi/Desktop/out.txt","w",stdout);
// ios::sync_with_stdio(false);
// cout.sync_with_stdio(false);
// cin.sync_with_stdio(false);
int kase;cin >> kase;
while(kase--) {
cin >> n;
Rep(i, 1, n) scanf("%s", mp[i] + 1);
ii t1, t2, t3;
Rep(i, 1, n) Rep(j, 1, n) {
if (mp[i][j] == 'A') t1 = ii(i, j);
if (mp[i][j] == 'B') t2 = ii(i, j);
if (mp[i][j] == 'C') t3 = ii(i, j);
}
int ans = bfs(t1, t2, t3);
if (ans == -1) printf("Case %d: trapped\n", ++nCase);
else printf("Case %d: %d\n", ++nCase, ans);
}
// showtime;
return 0;
}