http://acm.pku.edu.cn/JudgeOnline/problem?id=1101

Код:
#include <stdlib.h>
#include <stdio.h>
char tile[80][80];
int dist[80][80];
int size_x, size_y;
int main() {
int x, y;
int x1, y1, x2, y2;
int not_finished;
int cnt = 1, pair_cnt;
while (1) {
scanf("%d%d", &size_x, &size_y);
if (size_x == 0)
break;
size_x += 2;
size_y += 2;
for (x = 0; x < size_x; x++) {
tile[x][0] = 0;
tile[x][size_y - 1] = 0;
}
for (y = 0; y < size_y; y++) {
tile[0][y] = 0;
tile[size_x - 1][y] = 0;
}
for (y = 1; y < size_y - 1; y++) {
scanf("%*[^\n]");
scanf("%*c");
for (x = 1; x < size_x - 1; x++) {
scanf("%c", &tile[x][y]);
tile[x][y] = tile[x][y] == 'X';
}
}
printf("Board #%d:\n", cnt++);
pair_cnt = 1;
while (1) {
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
if (x1 == 0) break;
for (y = 0; y < size_y; y++)
for (x = 0; x < size_x; x++)
dist[x][y] = tile[x][y] ? -1 : 99999;
dist[x1][y1] = 0;
dist[x2][y2] = 99999;
not_finished = 1;
while (not_finished) {
not_finished = 0;
for (y = 0; y < size_y; y++)
for (x = 0; x < size_x; x++)
if (dist[x][y] != -1) {
int i;
for (i = x + 1; i < size_x; i++) {
if (dist[i][y] == -1) break;
if (dist[i][y] + 1 < dist[x][y])
dist[x][y] = dist[i][y] + 1, not_finished = 1;
}
for (i = x - 1; i >= 0; i--) {
if (dist[i][y] == -1) break;
if (dist[i][y] + 1 < dist[x][y])
dist[x][y] = dist[i][y] + 1, not_finished = 1;
}
for (i = y + 1; i < size_y; i++) {
if (dist[x][i] == -1) break;
if (dist[x][i] + 1 < dist[x][y])
dist[x][y] = dist[x][i] + 1, not_finished = 1;
}
for (i = y - 1; i >= 0; i--) {
if (dist[x][i] == -1) break;
if (dist[x][i] + 1 < dist[x][y])
dist[x][y] = dist[x][i] + 1, not_finished = 1;
}
}
}
printf("Pair %d: ", pair_cnt++);
if (dist[x2][y2] == 99999)
printf("impossible.\n");
else
printf("%d segments.\n", dist[x2][y2]);
}
printf("\n");
}
return 0;
}