#include #include #include #include #include #include #include #include using namespace std; #define FOR(i,N) for(int i=0;i D[60]; int sols; void back(int kolko){ //skusime, ci sa vsetky daju este nasadit if (kolko == K){ sols++; if(sols==1){ FOR(i,N){ FOR(j,M) printf("%c",S[i][j]); printf("\n"); } } return; } for(int l=kolko; l < K; l++){ //da sa l-ta polozit bool found = false; FOR(i,N)FOR(j,M-1){ if ( (S[i][j] == D[l].first && S[i][j+1] == D[l].second) || (S[i][j] == D[l].second && S[i][j+1] == D[l].first) ) found = true; if (found) break; } FOR(i,N-1)FOR(j,M){ if ( (S[i][j] == D[l].first && S[i+1][j] == D[l].second) || (S[i][j] == D[l].second && S[i+1][j] == D[l].first) ) found = true; if (found) break; } if (!found) return; } //vodorovne pridanie FOR(i,N)FOR(j,M-1){ if ( (S[i][j] == D[kolko].first && S[i][j+1] == D[kolko].second) || (S[i][j] == D[kolko].second && S[i][j+1] == D[kolko].first)){ S[i][j] = '['; S[i][j+1] = ']'; back(kolko+1); S[i][j] = I[i][j]; S[i][j+1] = I[i][j+1]; } } //zvisle pridanie FOR(i,N-1)FOR(j,M){ if ( (S[i][j] == D[kolko].first && S[i+1][j] == D[kolko].second) || (S[i][j] == D[kolko].second && S[i+1][j] == D[kolko].first)){ S[i][j] = 'n'; S[i+1][j] = 'u'; back(kolko+1); S[i][j] = I[i][j]; S[i+1][j] = I[i+1][j]; } } return; } int x,y; int pocm[10],poci[10]; int main(){ while(true){ scanf("%d %d %d", &N,&M,&K); if (N==0) break; memset(pocm,0,sizeof(pocm)); memset(poci,0,sizeof(poci)); FOR(i,K){ scanf("%d %d ",&x, &y); poci[x]++; poci[y]++; D[i].first = x+'0'; D[i].second = y+'0'; } //vstup! FOR(i,N){ FOR(j,M){ char c; scanf("%c ",&c); S[i][j] = c; I[i][j] = c; if (c!='X') pocm[c-'0']++; } } bool bad = false; FOR(i,10) if (pocm[i] != poci[i]){ bad = true; } if (bad){ printf("impossible\n\n"); continue; } sols = 0; back(0); if (sols == 0) printf("impossible\n\n"); else printf("%d\n\n",sols-1); } return 0; }