You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
1.5 KiB
90 lines
1.5 KiB
const int INF = 1073741824;
|
|
int a[30][30];
|
|
int step[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };
|
|
int w, h, x_0, y_0, x_1, y_1;
|
|
|
|
int search(int x, int y, int n)
|
|
{
|
|
if (n > 10)
|
|
return INF;
|
|
int num = INF;
|
|
int i = 0;
|
|
while (i < 4) {
|
|
int coun = 0;
|
|
int x2 = x, y2 = y;
|
|
while (a[x2][y2] != 1) {
|
|
if (x2 == x_1 && y2 == y_1) break;
|
|
x2 = x2 + step[i][0];
|
|
y2 = y2 + step[i][1];
|
|
coun = coun + 1;
|
|
}
|
|
if (x2 == x_1 && y2 == y_1)
|
|
return 1;
|
|
if (coun <= 1) {
|
|
i = i + 1;
|
|
continue;
|
|
}
|
|
if (x2 == 0 || x2 == h + 1 || y2 == 0 || y2 == w + 1) {
|
|
i = i + 1;
|
|
continue;
|
|
}
|
|
a[x2][y2] = 0;
|
|
int searchResult = search(x2 - step[i][0], y2 - step[i][1], n + 1) + 1;
|
|
if (searchResult < num)
|
|
num = searchResult;
|
|
a[x2][y2] = 1;
|
|
i = i + 1;
|
|
}
|
|
|
|
if (num > 10)
|
|
return INF;
|
|
return num;
|
|
}
|
|
|
|
int main()
|
|
{
|
|
w = getint();
|
|
h = getint();
|
|
while (w != 0) {
|
|
int i, j;
|
|
i = 0;
|
|
while (i < 30) {
|
|
j = 0;
|
|
while (j < 30) {
|
|
a[i][j] = 1;
|
|
j = j + 1;
|
|
}
|
|
i = i + 1;
|
|
}
|
|
i = 1;
|
|
while (i <= h) {
|
|
j = 1;
|
|
while (j <= w) {
|
|
a[i][j] = getint();
|
|
if (a[i][j] == 2) {
|
|
x_0 = i;
|
|
y_0 = j;
|
|
}
|
|
else if (a[i][j] == 3) {
|
|
x_1 = i;
|
|
y_1 = j;
|
|
}
|
|
j = j + 1;
|
|
}
|
|
i = i + 1;
|
|
}
|
|
int res = search(x_0, y_0, 1);
|
|
if (res <= 10) {
|
|
putint(res);
|
|
putch(10);
|
|
}
|
|
else {
|
|
putint(-1);
|
|
putch(10);
|
|
}
|
|
w = getint();
|
|
h = getint();
|
|
}
|
|
return 0;
|
|
}
|