#include #include #include #include struct tile { char a; char b; }; int res; tile tiles[55]; char g[20][20]; void place(int t, int M, int N, int K) { 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 a = g[i][j]; char b = g[i+1][j]; g[i][j] = 'n'; g[i+1][j] = 'u'; place(t+1, M, N, K); g[i][j] = a; g[i+1][j] = b; } } if (i > 0) { if (g[i-1][j] == tiles[t].b) { char a = g[i][j]; char b = g[i-1][j]; g[i][j] = 'u'; g[i-1][j] = 'n'; place(t+1, M, N, K); g[i][j] = a; g[i-1][j] = b; } } if (j < N) { if (g[i][j+1] == tiles[t].b) { char a = g[i][j+1]; char b = g[i][j]; g[i][j+1] = ']'; g[i][j] = '['; place(t+1, M, N, K); g[i][j+1] = a; g[i][j] = b; } } if (j > 0) { if (g[i][j-1] == tiles[t].b) { char a = g[i][j]; char b = g[i][j-1]; g[i][j] = ']'; g[i][j-1] = '['; place(t+1, M, N, K); g[i][j] = a; g[i][j-1] = b; } } } else { if (i < M) { if (g[i+1][j] == tiles[t].b) { char a = g[i][j]; char b = g[i+1][j]; g[i][j] = 'n'; g[i+1][j] = 'u'; place(t+1, M, N, K); g[i][j] = a; g[i+1][j] = b; } } if (j < N) { if (g[i][j+1] == tiles[t].b) { char a = g[i][j+1]; char b = g[i][j]; g[i][j+1] = ']'; g[i][j] = '['; place(t+1, M, N, K); g[i][j+1] = a; g[i][j] = b; } } } } } } } bool solve() { res = 0; memset(g, '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') g[i][j] = a; else j--; } scanf("\n"); } place(0, M, N, K); if (!res) printf("impossible\n\n"); else printf("%d\n\n", res-1); return true; } int main(int, char**) { while(solve()); return 0; }