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

http://acm.pku.edu.cn/JudgeOnline/images/1101/1101_1.jpg

Код:
#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;
}