#include #include #include #include struct tile { char a; char b; }; int res; tile tiles[55]; void place(int t, int M, int N, int K, char g[20][20]) { /*printf("Call with t %d\n", t); for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) printf("%c ", g[i][j]); printf("\n"); } printf("\n"); printf("\n"); */ if (t == K) { if (res == 0) { for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) printf("%c ", g[i][j]); printf("\n"); } } res++; return; } for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) { if (g[i][j] == tiles[t].a) { if (tiles[t].a != tiles[t].b) { if (i < M) { if (g[i+1][j] == tiles[t].b) { char n[20][20]; memcpy(n, g, sizeof(char)*20*20); n[i][j] = 'n'; n[i+1][j] = 'u'; place(t+1, M, N, K, n); } } if (i > 0) { if (g[i-1][j] == tiles[t].b) { char n[20][20]; memcpy(n, g, sizeof(char)*20*20); n[i][j] = 'u'; n[i-1][j] = 'n'; place(t+1, M, N, K, n); } } if (j < N) { if (g[i][j+1] == tiles[t].b) { char n[20][20]; memcpy(n, g, sizeof(char)*20*20); n[i][j+1] = ']'; n[i][j] = '['; place(t+1, M, N, K, n); } } if (j > 0) { if (g[i][j-1] == tiles[t].b) { char n[20][20]; memcpy(n, g, sizeof(char)*20*20); n[i][j] = ']'; n[i][j-1] = '['; place(t+1, M, N, K, n); } } } else { if (i < M) { if (g[i+1][j] == tiles[t].b) { char n[20][20]; memcpy(n, g, sizeof(char)*20*20); n[i][j] = 'n'; n[i+1][j] = 'u'; place(t+1, M, N, K, n); } } if (j < N) { if (g[i][j+1] == tiles[t].b) { char n[20][20]; memcpy(n, g, sizeof(char)*20*20); n[i][j+1] = ']'; n[i][j] = '['; place(t+1, M, N, K, n); } } } } } } } bool solve() { res = 0; char game[20][20]; memset(game, 'o', sizeof(char)*20*20); int M, N, K; scanf("%d %d %d\n", &M, &N, &K); if (M == 0) return false; for (int i = 0; i < K; i++) { int a,b; scanf("%d %d", &a, &b); tiles[i].a = a+'0'; tiles[i].b = b+'0'; } for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) { char a; scanf("%c", &a); if (isdigit(a) || a == 'X') game[i][j] = a; else j--; } scanf("\n"); } /*for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) printf("%c ", game[i][j]); printf("\n"); }*/ place(0, M, N, K, game); if (!res) printf("impossible\n\n"); else printf("%d\n\n", res-1); return true; } int main(int, char**) { while(solve()); return 0; }