#include #define MAX_N 250 #define UNEXPLORED -1 #define OBSTACLE -2 #define NUM_DIR 4 typedef struct { unsigned char l, c; } queue; int delta[NUM_DIR][2] = { { -1, 0 }, { 0, 1 }, { 1, 0 }, { 0, -1 } }; short d[MAX_N + 2][MAX_N + 2]; // matricea distanțelor, bordată queue q[MAX_N * MAX_N]; int qhead, qtail; void enqueue(int l, int c) { q[qtail].l = l; q[qtail].c = c; qtail++; } void dequeue(int *l, int *c) { *l = q[qhead].l; *c = q[qhead].c; qhead++; } int main(void) { int n, l, c; qhead = qtail = 0; FILE *f = fopen("muzeu.in", "r"); fscanf(f, "%d ", &n); for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { switch (fgetc(f)) { case '.': d[i][j] = UNEXPLORED; break; case '#': d[i][j] = OBSTACLE; break; case 'P': d[i][j] = 0; enqueue(i, j); break; } } fgetc(f); } fclose(f); for (int i = 1; i <= n; i++) { d[0][i] = d[n + 1][i] = d[i][0] = d[i][n + 1] = OBSTACLE; } while (qhead != qtail) { dequeue(&l, &c); for (int i = 0; i < NUM_DIR; i++) { if (d[l + delta[i][0]][c + delta[i][1]] == UNEXPLORED) { d[l + delta[i][0]][c + delta[i][1]] = d[l][c] + 1; enqueue(l + delta[i][0], c + delta[i][1]); } } } f = fopen("muzeu.out", "w"); for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { fprintf(f, "%d ", d[i][j]); } fputc('\n', f); } fclose(f); }