N×N(10<=N<=20)的迷宫,0代表空可以通过,1代表墙无法通过,2代表箱子可以被推动
箱子可以被推动到邻近的0位置,不可以是1或者2,也不可以是人当前所在的位置
人的起始位置是左上角,目标位置是右下角
能够达到输出1,不能输出0
输入:
用例数T
N
N×N的迷宫
5
10
0 0 1 0 0 1 1 0 0 0
1 0 2 0 0 1 1 0 0 0
1 1 2 1 1 1 1 1 1 1
1 1 0 1 1 1 1 1 1 1
1 1 0 1 1 1 1 1 1 1
1 1 0 0 0 0 0 1 1 1
1 1 1 1 1 2 1 1 1 1
1 1 1 0 0 0 0 1 1 1
1 1 1 0 0 0 0 1 1 1
1 1 1 1 1 1 0 0 0 0
10
0 0 1 0 0 1 1 0 0 0
1 0 2 0 0 1 1 0 0 0
1 1 2 1 1 1 1 1 1 1
1 1 0 1 1 1 1 1 1 1
1 1 0 1 1 1 1 1 1 1
1 1 0 2 0 0 0 1 1 1
1 1 1 1 1 2 1 1 1 1
1 1 1 0 0 0 0 1 1 1
1 1 1 0 0 0 0 1 1 1
1 1 1 1 1 1 0 0 0 0
10
0 0 1 0 0 1 1 0 0 0
1 0 2 0 0 1 1 0 0 0
1 1 2 1 1 1 1 1 1 1
1 1 0 1 1 1 1 1 1 1
1 1 0 1 1 1 1 1 1 1
1 1 0 2 0 0 0 1 1 1
1 1 0 1 1 2 1 1 1 1
1 1 1 0 0 0 0 1 1 1
1 1 1 0 0 0 0 1 1 1
1 1 1 1 1 1 0 0 0 0
10
0 0 1 0 0 1 1 0 0 0
1 0 2 0 0 1 1 0 0 0
1 1 2 1 1 0 1 2 1 0
1 1 0 1 1 2 0 0 1 0
1 1 0 1 1 0 1 1 0 0
1 1 0 2 0 0 0 1 0 1
1 1 0 1 1 2 1 1 0 1
1 1 1 0 0 2 0 1 0 1
1 1 1 0 0 0 0 1 0 0
1 1 1 1 1 1 0 0 1 0
10
0 0 1 0 0 1 1 0 0 0
1 0 2 0 0 1 1 0 0 0
1 1 2 1 1 0 1 2 1 0
1 1 0 1 1 2 0 0 1 0
1 1 0 1 1 0 1 1 0 0
1 1 0 2 0 0 0 1 0 1
1 1 0 1 1 2 1 1 0 1
1 1 1 0 0 2 0 1 0 1
1 1 1 0 0 0 0 1 0 2
1 1 1 1 1 1 0 0 1 0
output:
#1 1
#2 0
#3 1
#4 1
#5 0
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int T, N, data[20][20], answer, d[4][2] = { { 0, 1 }, { 0, -1 }, { 1, 0 }, { -1, 0 } };
bool flag[20][20];
void dfs(int x, int y){
if (answer == 1){
return;
}
if (x == N - 1 && y == N - 1){
answer = 1;
return;
}
for (int direction = 0; direction < 4; direction++){
int nextX = x + d[direction][0];
int nextY = y + d[direction][1];
if (nextX >= 0 && nextX < N && nextY >= 0 && nextY < N && data[nextX][nextY] != 1 && !flag[nextX][nextY]){
flag[nextX][nextY] = true;
if (data[nextX][nextY] == 0){
dfs(nextX, nextY);
}
else {
// 遇到箱子。考虑箱子可以推去的位置
for (int pushBox = 0; pushBox < 4; pushBox++){
int pushBoxX = nextX + d[pushBox][0];
int pushBoxY = nextY + d[pushBox][1];
if (pushBoxX >= 0 && pushBoxX < N && pushBoxY >= 0 && pushBoxY < N
// 箱子被推的位置不能是当前的位置(x,y),而且只能是0
&& (pushBoxX != x || pushBoxY != y) && data[pushBoxX][pushBoxY] == 0){
data[nextX][nextY] = 0;
data[pushBoxX][pushBoxY] = 2;
dfs(nextX, nextY);
// 要将箱子还原到原来的位置
data[nextX][nextY] = 2;
data[pushBoxX][pushBoxY] = 0;
}
}
}
flag[nextX][nextY] = false;
}
}
}
int main(int argc, char** argv) {
freopen("sample_input.txt", "r", stdin);
setbuf(stdout, NULL);
scanf("%d", &T);
for (int test_case = 1; test_case <= T; ++test_case){
scanf("%d", &N);
for (int i = 0; i < N; i++){
for (int j = 0; j < N; j++){
scanf("%d", &data[i][j]);
flag[i][j] = false;
}
}
answer = 0;
flag[0][0] = true;
dfs(0, 0);
printf("#%d %d\n", test_case, answer);
}
return 0;
}