import java.util.Arrays;
import java.util.Scanner;
class Sudoku {
private final int SIZE = 9;
private final int[] MASK = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024};
private int[] row, col, group;
private int[][] map;
private int blank;
private boolean solved;
private int count;
private void solve() {
Scanner sc
= new Scanner
(System.
in); while(sc.hasNext()) {
for(int i=0;i<SIZE;i++) {
data[i] = sc.nextLine();
}
solved = false;
blank = 0;
count = 0;
row = new int[SIZE];
col = new int[SIZE];
group = new int[SIZE];
map = new int[SIZE][SIZE];
for(int i=0;i<SIZE;i++) {
for(int j=0;j<SIZE;j++) {
map[i][j] = data[i].charAt(j)-'0';
if(map[i][j]==0) {
blank++;
} else {
setBit(j, i, map[i][j]);
}
}
}
find(0, 0);
if(!solved) {
System.
out.
println("先生…解けません…!"); }
}
}
private void find(int x, int y) {
if(count==blank) {
put(map);
solved = true;
} else {
while(map[y][x]!=0) {
if(x+1==SIZE) y = (y + 1) % SIZE;
x = (x + 1) % SIZE;
}
for(int i=1;i<=9;i++) {
if(!testBit(x, y, i)) {
setBit(x, y, i);
map[y][x] = i;
count++;
find(x, y);
if(solved) return;
count--;
map[y][x] = 0;
clearBit(x, y, i);
}
}
}
}
private void setBit(int x, int y, int n) {
row[y] |= MASK[n];
col[x] |= MASK[n];
group[getGroup(x, y)] |= MASK[n];
}
private void clearBit(int x, int y, int n) {
row[y] &= ~MASK[n];
col[x] &= ~MASK[n];
group[getGroup(x, y)] &= ~MASK[n];
}
private boolean testBit(int x, int y, int n) {
return ((row[y] & MASK[n]) > 0) || ((col[x] & MASK[n]) > 0) || ((group[getGroup(x, y)] & MASK[n]) > 0);
}
private int getGroup(int x, int y) {
return (y / 3) * 3 + (x / 3);
}
private void put(int[][] map) {
for(int i=0;i<SIZE;i++) {
for(int j=0;j<SIZE;j++) {
System.
out.
printf("%d", map
[i
][j
]); }
}
}
public static void main
(String[] args
) { new Sudoku().solve();
}
}
aW1wb3J0IGphdmEudXRpbC5BcnJheXM7CmltcG9ydCBqYXZhLnV0aWwuU2Nhbm5lcjsKCmNsYXNzIFN1ZG9rdSB7Cglwcml2YXRlIGZpbmFsIGludCBTSVpFID0gOTsKCXByaXZhdGUgZmluYWwgaW50W10gTUFTSyA9IHsxLCAyLCA0LCA4LCAxNiwgMzIsIDY0LCAxMjgsIDI1NiwgNTEyLCAxMDI0fTsKCXByaXZhdGUgaW50W10gcm93LCBjb2wsIGdyb3VwOwoJcHJpdmF0ZSBpbnRbXVtdIG1hcDsKCXByaXZhdGUgaW50IGJsYW5rOwoJcHJpdmF0ZSBib29sZWFuIHNvbHZlZDsKCXByaXZhdGUgaW50IGNvdW50OwoJCglwcml2YXRlIHZvaWQgc29sdmUoKSB7CgkJU2Nhbm5lciBzYyA9IG5ldyBTY2FubmVyKFN5c3RlbS5pbik7CgkJd2hpbGUoc2MuaGFzTmV4dCgpKSB7CgkJCVN0cmluZ1tdIGRhdGEgPSBuZXcgU3RyaW5nW1NJWkVdOwoJCQlmb3IoaW50IGk9MDtpPFNJWkU7aSsrKSB7CgkJCQlkYXRhW2ldID0gc2MubmV4dExpbmUoKTsKCQkJfQoJCQkKCQkJc29sdmVkID0gZmFsc2U7CgkJCWJsYW5rID0gMDsKCQkJY291bnQgPSAwOwoJCQlyb3cgPSBuZXcgaW50W1NJWkVdOwoJCQljb2wgPSBuZXcgaW50W1NJWkVdOwoJCQlncm91cCA9IG5ldyBpbnRbU0laRV07CgkJCW1hcCA9IG5ldyBpbnRbU0laRV1bU0laRV07CgkJCUFycmF5cy5maWxsKHJvdywgMCk7CgkJCUFycmF5cy5maWxsKGNvbCwgMCk7CgkJCUFycmF5cy5maWxsKGdyb3VwLCAwKTsKCQkJZm9yKGludCBpPTA7aTxTSVpFO2krKykgewoJCQkJZm9yKGludCBqPTA7ajxTSVpFO2orKykgewoJCQkJCW1hcFtpXVtqXSA9IGRhdGFbaV0uY2hhckF0KGopLScwJzsKCQkJCQlpZihtYXBbaV1bal09PTApIHsKCQkJCQkJYmxhbmsrKzsKCQkJCQl9IGVsc2UgewoJCQkJCQlzZXRCaXQoaiwgaSwgbWFwW2ldW2pdKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJZmluZCgwLCAwKTsKCQkJaWYoIXNvbHZlZCkgewoJCQkJU3lzdGVtLm91dC5wcmludGxuKCLlhYjnlJ/igKbop6PjgZHjgb7jgZvjgpPigKbvvIEiKTsKCQkJfQoJCX0KCX0KCQoJcHJpdmF0ZSB2b2lkIGZpbmQoaW50IHgsIGludCB5KSB7CgkJaWYoY291bnQ9PWJsYW5rKSB7CgkJCXB1dChtYXApOwoJCQlzb2x2ZWQgPSB0cnVlOwoJCX0gZWxzZSB7CgkJCXdoaWxlKG1hcFt5XVt4XSE9MCkgewoJCQkJaWYoeCsxPT1TSVpFKSB5ID0gKHkgKyAxKSAlIFNJWkU7CgkJCQl4ID0gKHggKyAxKSAlIFNJWkU7CgkJCX0KCQkJZm9yKGludCBpPTE7aTw9OTtpKyspIHsKCQkJCWlmKCF0ZXN0Qml0KHgsIHksIGkpKSB7CgkJCQkJc2V0Qml0KHgsIHksIGkpOwoJCQkJCW1hcFt5XVt4XSA9IGk7CgkJCQkJY291bnQrKzsKCQkJCQlmaW5kKHgsIHkpOwoJCQkJCWlmKHNvbHZlZCkgcmV0dXJuOwoJCQkJCWNvdW50LS07CgkJCQkJbWFwW3ldW3hdID0gMDsKCQkJCQljbGVhckJpdCh4LCB5LCBpKTsKCQkJCX0KCQkJfQoJCX0KCX0KCQoJcHJpdmF0ZSB2b2lkIHNldEJpdChpbnQgeCwgaW50IHksIGludCBuKSB7CgkJcm93W3ldIHw9IE1BU0tbbl07CgkJY29sW3hdIHw9IE1BU0tbbl07CgkJZ3JvdXBbZ2V0R3JvdXAoeCwgeSldIHw9IE1BU0tbbl07Cgl9CgkKCXByaXZhdGUgdm9pZCBjbGVhckJpdChpbnQgeCwgaW50IHksIGludCBuKSB7CgkJcm93W3ldICY9IH5NQVNLW25dOwoJCWNvbFt4XSAmPSB+TUFTS1tuXTsKCQlncm91cFtnZXRHcm91cCh4LCB5KV0gJj0gfk1BU0tbbl07Cgl9CgkKCXByaXZhdGUgYm9vbGVhbiB0ZXN0Qml0KGludCB4LCBpbnQgeSwgaW50IG4pIHsKCQlyZXR1cm4gKChyb3dbeV0gJiBNQVNLW25dKSA+IDApIHx8ICgoY29sW3hdICYgTUFTS1tuXSkgPiAwKSB8fCAoKGdyb3VwW2dldEdyb3VwKHgsIHkpXSAmIE1BU0tbbl0pID4gMCk7Cgl9CgkKCXByaXZhdGUgaW50IGdldEdyb3VwKGludCB4LCBpbnQgeSkgewoJCXJldHVybiAoeSAvIDMpICogMyArICh4IC8gMyk7Cgl9CgkKCXByaXZhdGUgdm9pZCBwdXQoaW50W11bXSBtYXApIHsKCQlmb3IoaW50IGk9MDtpPFNJWkU7aSsrKSB7CgkJCWZvcihpbnQgaj0wO2o8U0laRTtqKyspIHsKCQkJCVN5c3RlbS5vdXQucHJpbnRmKCIlZCIsIG1hcFtpXVtqXSk7CgkJCX0KCQkJU3lzdGVtLm91dC5wcmludGxuKCk7CgkJfQoJCVN5c3RlbS5vdXQucHJpbnRsbigpOwoJfQoJCQoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeyAKCQluZXcgU3Vkb2t1KCkuc29sdmUoKTsKCX0KfQ==