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