#define DEBUG 0 #include #include #define MAX 10240000 char map[128][128]; int level[128][128]; int dist[128][128]; int w, h, Sx, Sy, Dx, Dy; /* * Set "Risk Level" with a corner of a stronghold */ void flood(int x, int y) { int ix, iy, d; for (iy = 0; iy <= h+2; iy++) { for (ix = 0; ix <= w+2; ix++) { d = abs(ix - x) + abs(iy - y); if (level[iy][ix] < w + h - d) { level[iy][ix] = w + h - d; } } } } int main() { int n_set, i_set, x, y, d, i, nextd; int dx[4] = {1, 0, -1, 0}; int dy[4] = {0, 1, 0, -1}; int obstractx[8] = {0, 0, 0, -1, -1, -1, -1, 0}; int obstracty[8] = {-1, 0, 0, 0, 0, -1, -1, -1}; char s[1024]; freopen("erythea.txt", "r", stdin); gets(s); n_set = atoi(s); for (i_set = 0; i_set < n_set; i_set++) { gets(s); sscanf(s, "%d%d", &h, &w); gets(s); sscanf(s, "%d%d%d%d", &Sy, &Sx, &Dy, &Dx); /* Adjust Base => 1-Base */ Sx++; Sy++; Dx++; Dy++; /* * Generate a "Strongholds-Map" with Sentinels(Bampei) */ for (x = 0; x <= w+1; x++) { map[0 ][x] = '0'; map[h+1][x] = '0'; } map[0 ][w+2] = '\0'; map[h+1][w+2] = '\0'; for (y = 1; y <= h; y++) { map[y][0] = '0'; gets(&map[y][1]); map[y][w+1] = '0'; map[y][w+2] = '\0'; } #if DEBUG printf("Map :\n"); for (y = 0; y <= h+1; y++) { puts(map[y]); } printf("\n"); #endif /* * Initialize "Risk Level" */ for (y = 0; y <= h+2; y++) { for (x = 0; x <= w+2; x++) { dist[y][x] = MAX; if (x == 0 || y == 0 || x == w+2 || y == h+2) { level[y][x] = MAX; } else { level[y][x] = 0; } } } /* * Set "Risk Level" */ for (y = 1; y <= h; y++) { for (x = 1; x <= w; x++) { if (map[y][x] == '1') { flood(x , y ); flood(x+1, y ); flood(x , y+1); flood(x+1, y+1); } } } #if DEBUG printf("Risk Levels :\n"); for (y = 0; y <= h+2; y++) { for (x = 0; x <= w+2; x++) { if (level[y][x] == MAX) { printf(" ++"); } else { printf(" %2d", level[y][x]); } if (x == Sx && y == Sy) { printf("S "); } else if (x == Dx && y == Dy) { printf("D "); } else { printf(" "); } } printf("\n"); } printf("\n"); #endif /* * Breadth-First Search */ dist[Sy][Sx] = level[Sy][Sx]; for (d = 0; ; d = nextd) { nextd = MAX; for (y = 1; y <= h+1; y++) { for (x = 1; x <= w+1; x++) { if (dist[y][x] > d && dist[y][x] < nextd) { nextd = dist[y][x]; } for (i = 0; i < 4; i++) { if (dist[y][x] == d && dist[y][x] + level[y+dy[i]][x+dx[i]] < dist[y+dy[i]][x+dx[i]] && (map[y+obstracty[i*2+0]][x+obstractx[i*2+0]] == '0' || map[y+obstracty[i*2+1]][x+obstractx[i*2+1]] == '0')) { dist[y+dy[i]][x+dx[i]] = dist[y][x] + level[y+dy[i]][x+dx[i]]; if (x+dx[i] == Dx && y+dy[i] == Dy) { goto quit; } } } } } if (nextd == MAX) { break; } #if DEBUG > 1 printf("Distance Map (d = %d) :\n", d); #endif #if DEBUG > 2 for (y = 0; y <= h+2; y++) { for (x = 0; x <= w+2; x++) { if (dist[y][x] == MAX) { printf(" +++"); } else { printf(" %3d", dist[y][x]); } if (x == Sx && y == Sy) { printf("S "); } else if (x == Dx && y == Dy) { printf("D "); } else { printf(" "); } } printf("\n"); } printf("\n"); #endif } quit:; #if DEBUG printf("Distance Map (Complete) :\n"); for (y = 0; y <= h+2; y++) { for (x = 0; x <= w+2; x++) { if (dist[y][x] == MAX) { printf(" +++"); } else { printf(" %3d", dist[y][x]); } if (x == Sx && y == Sy) { printf("S "); } else if (x == Dx && y == Dy) { printf("D "); } else { printf(" "); } } printf("\n"); } printf("\n"); #endif if (dist[Dy][Dx] == MAX) { printf("no solution\n"); } else { printf("%d\n", dist[Dy][Dx]); } } return 0; }