sysy/hidden_functional_c/sy/19_search.sy

90 lines
1.5 KiB
Plaintext

#define 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;
}