//4574
#include <bits/stdc++.h>
using namespace std;
#define INF 1000000000
#define MAX 10000001
#define MOD 1000000007
typedef long long ll;
typedef vector<int> vi;
typedef vector<vector<int>> vvi;
typedef vector<pair<int, int>> vii;
typedef pair<int, int> ii;
bool domino[10][10], row[10][10], col[10][10], block[10][10], finish;
int a[10][10], dx[] = { -1,1,0,0 }, dy[] = { 0,0,1,-1 };
int testcase;
ii Where(string s) {
return { s[0] - 'A', s[1] - '1' }; //row, col
}
//블럭 번호
int B(string s) {
int row = s[0] - 'A', col = s[1] - '1';
return (row / 3) * 3 + col / 3;
}
int B(int x, int y) { return (x / 3) * 3 + y / 3; }
bool OOB(int x, int y) { return x < 0 || x >= 9 || y < 0 || y >= 9; }
void solve(int x, int y, int remain) {
//완성됐다면 종료
if (finish) return;
//완성 여부 체크
if (x==8 && y==8) {
finish = remain == 0 ? true : false;
if (finish) {
/*
이 부분 입니다!
*/
//cout << "Puzzle " << ++testcase << '\n';
printf("Puzzle %d\n", ++testcase);
for (int i = 0; i < 9; ++i) {
for (int j = 0; j < 9; ++j)
cout << a[i][j];
cout << '\n';
}
}
return;
}
//현재 위치에 이미 숫자가 적혀 있을 경우
if (a[x][y] != 0) {
if (OOB(x, y + 1)) solve(x + 1, 0, remain);
else solve(x, y + 1, remain);
return;
}
for (int num = 1; num <= 9; ++num) {
if (row[x][num] || col[y][num] || block[B(x, y)][num]) continue;
for (int i = 0; i < 4; ++i) {
int nx = x + dx[i], ny = y + dy[i];
if (OOB(nx, ny) || a[nx][ny]) continue;
for (int nextNum = 1; nextNum <= 9; ++nextNum) {
if (row[nx][nextNum] || col[ny][nextNum] || block[B(nx, ny)][nextNum] || domino[num][nextNum]) continue;
row[x][num] = col[y][num] = block[B(x, y)][num] = true;
row[nx][nextNum] = col[ny][nextNum] = block[B(nx, ny)][nextNum] = true;
domino[num][nextNum] = domino[nextNum][num] = true;
a[x][y] = num; a[nx][ny] = nextNum;
if (OOB(x, y + 1)) solve(x + 1, 0, remain-2);
else solve(x, y + 1, remain-2);
if (finish) return;
row[x][num] = col[y][num] = block[B(x, y)][num] = false;
row[nx][nextNum] = col[ny][nextNum] = block[B(nx, ny)][nextNum] = false;
domino[num][nextNum] = domino[nextNum][num] = false;
a[x][y] = a[nx][ny] = 0;
}
}
}
}
int main() {
cin.tie(nullptr);
cout.tie(NULL);
ios_base::sync_with_stdio(false);
while (1) {
finish = false;
for (int i = 0; i < 10; ++i) for (int j = 0; j < 10; ++j) {
domino[i][j] = row[i][j] = col[i][j] = block[i][j] = a[i][j] = 0;
}
int n; cin >> n;
if (n == 0) break;
for (int i = 0; i < n; ++i) {
int u, v; string lu, lv;
cin >> u >> lu >> v >> lv;
domino[u][v] = domino[v][u] = true;
a[Where(lu).first][Where(lu).second] = u;
a[Where(lv).first][Where(lv).second] = v;
row[Where(lu).first][u] = row[Where(lv).first][v] = true;
col[Where(lu).second][u] = col[Where(lv).second][v] = true;
block[B(lu)][u] = block[B(lv)][v] = true;
}
for (int i = 1; i <= 9; ++i) {
string s; cin >> s;
a[Where(s).first][Where(s).second] = i;
row[Where(s).first][i] = col[Where(s).second][i] = true;
block[B(s)][i] = true;
}
//도미노는 같은 쌍의 수를 가질 수 없음
for (int i = 1; i <= 9; ++i) domino[i][i] = true;
solve(0, 0, 81-(n*2+9));
}
return 0;
}
Ly80NTc0CiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwojZGVmaW5lIElORiAxMDAwMDAwMDAwCiNkZWZpbmUgTUFYIDEwMDAwMDAxCiNkZWZpbmUgTU9EIDEwMDAwMDAwMDcKdHlwZWRlZiBsb25nIGxvbmcgbGw7CnR5cGVkZWYgdmVjdG9yPGludD4gdmk7CnR5cGVkZWYgdmVjdG9yPHZlY3RvcjxpbnQ+PiB2dmk7CnR5cGVkZWYgdmVjdG9yPHBhaXI8aW50LCBpbnQ+PiB2aWk7CnR5cGVkZWYgcGFpcjxpbnQsIGludD4gaWk7Cgpib29sIGRvbWlub1sxMF1bMTBdLCByb3dbMTBdWzEwXSwgY29sWzEwXVsxMF0sIGJsb2NrWzEwXVsxMF0sIGZpbmlzaDsKaW50IGFbMTBdWzEwXSwgZHhbXSA9IHsgLTEsMSwwLDAgfSwgZHlbXSA9IHsgMCwwLDEsLTEgfTsKaW50IHRlc3RjYXNlOwoKaWkgV2hlcmUoc3RyaW5nIHMpIHsKCXJldHVybiB7IHNbMF0gLSAnQScsIHNbMV0gLSAnMScgfTsgLy9yb3csIGNvbAp9CgovL+u4lOufrSDrsojtmLgKaW50IEIoc3RyaW5nIHMpIHsKCWludCByb3cgPSBzWzBdIC0gJ0EnLCBjb2wgPSBzWzFdIC0gJzEnOwoJcmV0dXJuIChyb3cgLyAzKSAqIDMgKyBjb2wgLyAzOwp9CgppbnQgQihpbnQgeCwgaW50IHkpIHsgcmV0dXJuICh4IC8gMykgKiAzICsgeSAvIDM7IH0KCmJvb2wgT09CKGludCB4LCBpbnQgeSkgeyByZXR1cm4geCA8IDAgfHwgeCA+PSA5IHx8IHkgPCAwIHx8IHkgPj0gOTsgfQoKdm9pZCBzb2x2ZShpbnQgeCwgaW50IHksIGludCByZW1haW4pIHsKCS8v7JmE7ISx65CQ64uk66m0IOyiheujjAoJaWYgKGZpbmlzaCkgcmV0dXJuOwoKCS8v7JmE7ISxIOyXrOu2gCDssrTtgawKCWlmICh4PT04ICYmIHk9PTgpIHsKCQlmaW5pc2ggPSByZW1haW4gPT0gMCA/IHRydWUgOiBmYWxzZTsKCQlpZiAoZmluaXNoKSB7CgkJCS8qCgkJCQnsnbQg67aA67aEIOyeheuLiOuLpCEKCQkJKi8KCQkJCgkJCS8vY291dCA8PCAiUHV6emxlICIgPDwgKyt0ZXN0Y2FzZSA8PCAnXG4nOwoJCQlwcmludGYoIlB1enpsZSAlZFxuIiwgKyt0ZXN0Y2FzZSk7CgkJCWZvciAoaW50IGkgPSAwOyBpIDwgOTsgKytpKSB7CgkJCQlmb3IgKGludCBqID0gMDsgaiA8IDk7ICsraikKCQkJCQljb3V0IDw8IGFbaV1bal07CgkJCQljb3V0IDw8ICdcbic7CgkJCX0KCQl9CgkJcmV0dXJuOwoJfQoKCS8v7ZiE7J6sIOychOy5mOyXkCDsnbTrr7gg7Iir7J6Q6rCAIOygge2YgCDsnojsnYQg6rK97JqwCglpZiAoYVt4XVt5XSAhPSAwKSB7CgkJaWYgKE9PQih4LCB5ICsgMSkpIHNvbHZlKHggKyAxLCAwLCByZW1haW4pOwoJCWVsc2Ugc29sdmUoeCwgeSArIDEsIHJlbWFpbik7CgkJcmV0dXJuOwoJfQoKCWZvciAoaW50IG51bSA9IDE7IG51bSA8PSA5OyArK251bSkgewoJCWlmIChyb3dbeF1bbnVtXSB8fCBjb2xbeV1bbnVtXSB8fCBibG9ja1tCKHgsIHkpXVtudW1dKSBjb250aW51ZTsKCQlmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSkgewoJCQlpbnQgbnggPSB4ICsgZHhbaV0sIG55ID0geSArIGR5W2ldOwoJCQlpZiAoT09CKG54LCBueSkgfHwgYVtueF1bbnldKSBjb250aW51ZTsKCQkJZm9yIChpbnQgbmV4dE51bSA9IDE7IG5leHROdW0gPD0gOTsgKytuZXh0TnVtKSB7CgkJCQlpZiAocm93W254XVtuZXh0TnVtXSB8fCBjb2xbbnldW25leHROdW1dIHx8IGJsb2NrW0IobngsIG55KV1bbmV4dE51bV0gfHwgZG9taW5vW251bV1bbmV4dE51bV0pIGNvbnRpbnVlOwoJCQkJcm93W3hdW251bV0gPSBjb2xbeV1bbnVtXSA9IGJsb2NrW0IoeCwgeSldW251bV0gPSB0cnVlOwoJCQkJcm93W254XVtuZXh0TnVtXSA9IGNvbFtueV1bbmV4dE51bV0gPSBibG9ja1tCKG54LCBueSldW25leHROdW1dID0gdHJ1ZTsKCQkJCWRvbWlub1tudW1dW25leHROdW1dID0gZG9taW5vW25leHROdW1dW251bV0gPSB0cnVlOwoJCQkJYVt4XVt5XSA9IG51bTsgYVtueF1bbnldID0gbmV4dE51bTsKCgkJCQlpZiAoT09CKHgsIHkgKyAxKSkgc29sdmUoeCArIDEsIDAsIHJlbWFpbi0yKTsKCQkJCWVsc2Ugc29sdmUoeCwgeSArIDEsIHJlbWFpbi0yKTsKCQkJCWlmIChmaW5pc2gpIHJldHVybjsKCgkJCQlyb3dbeF1bbnVtXSA9IGNvbFt5XVtudW1dID0gYmxvY2tbQih4LCB5KV1bbnVtXSA9IGZhbHNlOwoJCQkJcm93W254XVtuZXh0TnVtXSA9IGNvbFtueV1bbmV4dE51bV0gPSBibG9ja1tCKG54LCBueSldW25leHROdW1dID0gZmFsc2U7CgkJCQlkb21pbm9bbnVtXVtuZXh0TnVtXSA9IGRvbWlub1tuZXh0TnVtXVtudW1dID0gZmFsc2U7CgkJCQlhW3hdW3ldID0gYVtueF1bbnldID0gMDsKCQkJfQoJCX0KCX0KfQoKaW50IG1haW4oKSB7CgoJY2luLnRpZShudWxscHRyKTsKCWNvdXQudGllKE5VTEwpOwoJaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CgoJd2hpbGUgKDEpIHsKCQlmaW5pc2ggPSBmYWxzZTsKCQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpIGZvciAoaW50IGogPSAwOyBqIDwgMTA7ICsraikgewoJCQlkb21pbm9baV1bal0gPSByb3dbaV1bal0gPSBjb2xbaV1bal0gPSBibG9ja1tpXVtqXSA9IGFbaV1bal0gPSAwOwoJCX0KCgkJaW50IG47IGNpbiA+PiBuOwoJCWlmIChuID09IDApIGJyZWFrOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CgkJCWludCB1LCB2OyBzdHJpbmcgbHUsIGx2OwoJCQljaW4gPj4gdSA+PiBsdSA+PiB2ID4+IGx2OwoJCQlkb21pbm9bdV1bdl0gPSBkb21pbm9bdl1bdV0gPSB0cnVlOwoJCQlhW1doZXJlKGx1KS5maXJzdF1bV2hlcmUobHUpLnNlY29uZF0gPSB1OwoJCQlhW1doZXJlKGx2KS5maXJzdF1bV2hlcmUobHYpLnNlY29uZF0gPSB2OwoJCQlyb3dbV2hlcmUobHUpLmZpcnN0XVt1XSA9IHJvd1tXaGVyZShsdikuZmlyc3RdW3ZdID0gdHJ1ZTsKCQkJY29sW1doZXJlKGx1KS5zZWNvbmRdW3VdID0gY29sW1doZXJlKGx2KS5zZWNvbmRdW3ZdID0gdHJ1ZTsKCQkJYmxvY2tbQihsdSldW3VdID0gYmxvY2tbQihsdildW3ZdID0gdHJ1ZTsKCQl9CgoJCWZvciAoaW50IGkgPSAxOyBpIDw9IDk7ICsraSkgewoJCQlzdHJpbmcgczsgY2luID4+IHM7CgkJCWFbV2hlcmUocykuZmlyc3RdW1doZXJlKHMpLnNlY29uZF0gPSBpOwoJCQlyb3dbV2hlcmUocykuZmlyc3RdW2ldID0gY29sW1doZXJlKHMpLnNlY29uZF1baV0gPSB0cnVlOwoJCQlibG9ja1tCKHMpXVtpXSA9IHRydWU7CgkJfQoKCQkvL+uPhOuvuOuFuOuKlCDqsJnsnYAg7IyN7J2YIOyImOulvCDqsIDsp4gg7IiYIOyXhuydjAoJCWZvciAoaW50IGkgPSAxOyBpIDw9IDk7ICsraSkgZG9taW5vW2ldW2ldID0gdHJ1ZTsKCgkJc29sdmUoMCwgMCwgODEtKG4qMis5KSk7Cgl9CgoJcmV0dXJuIDA7Cn0=