#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 9
int grid[SIZE][SIZE];
// シャッフル用
void shuffle(int *array, int size) {
for (int i = size - 1; i > 0; i--) {
int j
= rand() % (i
+ 1); int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
}
// 指定のマスに値が置けるかどうかを判定
int isSafe(int row, int col, int num) {
for (int x = 0; x < SIZE; x++) {
if (grid[row][x] == num || grid[x][col] == num)
return 0;
}
int startRow = row - row % 3;
int startCol = col - col % 3;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (grid[startRow + i][startCol + j] == num)
return 0;
}
}
return 1;
}
// 再帰的にナンプレを完成させる
int fillGrid(int row, int col) {
if (row == SIZE - 1 && col == SIZE)
return 1;
if (col == SIZE) {
row++;
col = 0;
}
if (grid[row][col] != 0)
return fillGrid(row, col + 1);
int nums[SIZE];
for (int i = 0; i < SIZE; i++) nums[i] = i + 1;
shuffle(nums, SIZE);
for (int i = 0; i < SIZE; i++) {
int num = nums[i];
if (isSafe(row, col, num)) {
grid[row][col] = num;
if (fillGrid(row, col + 1))
return 1;
grid[row][col] = 0;
}
}
return 0;
}
// グリッドの表示
void printGrid() {
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
}
}
}
int main() {
// グリッド初期化
for (int i = 0; i < SIZE; i++)
for (int j = 0; j < SIZE; j++)
grid[i][j] = 0;
if (fillGrid(0, 0)) {
printGrid();
} else {
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHRpbWUuaD4KCiNkZWZpbmUgU0laRSA5CgppbnQgZ3JpZFtTSVpFXVtTSVpFXTsKCi8vIOOCt+ODo+ODg+ODleODq+eUqAp2b2lkIHNodWZmbGUoaW50ICphcnJheSwgaW50IHNpemUpIHsKICAgIGZvciAoaW50IGkgPSBzaXplIC0gMTsgaSA+IDA7IGktLSkgewogICAgICAgIGludCBqID0gcmFuZCgpICUgKGkgKyAxKTsKICAgICAgICBpbnQgdG1wID0gYXJyYXlbaV07CiAgICAgICAgYXJyYXlbaV0gPSBhcnJheVtqXTsKICAgICAgICBhcnJheVtqXSA9IHRtcDsKICAgIH0KfQoKLy8g5oyH5a6a44Gu44Oe44K544Gr5YCk44GM572u44GR44KL44GL44Gp44GG44GL44KS5Yik5a6aCmludCBpc1NhZmUoaW50IHJvdywgaW50IGNvbCwgaW50IG51bSkgewogICAgZm9yIChpbnQgeCA9IDA7IHggPCBTSVpFOyB4KyspIHsKICAgICAgICBpZiAoZ3JpZFtyb3ddW3hdID09IG51bSB8fCBncmlkW3hdW2NvbF0gPT0gbnVtKQogICAgICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBpbnQgc3RhcnRSb3cgPSByb3cgLSByb3cgJSAzOwogICAgaW50IHN0YXJ0Q29sID0gY29sIC0gY29sICUgMzsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgaisrKSB7CiAgICAgICAgICAgIGlmIChncmlkW3N0YXJ0Um93ICsgaV1bc3RhcnRDb2wgKyBqXSA9PSBudW0pCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCi8vIOWGjeW4sOeahOOBq+ODiuODs+ODl+ODrOOCkuWujOaIkOOBleOBm+OCiwppbnQgZmlsbEdyaWQoaW50IHJvdywgaW50IGNvbCkgewogICAgaWYgKHJvdyA9PSBTSVpFIC0gMSAmJiBjb2wgPT0gU0laRSkKICAgICAgICByZXR1cm4gMTsKICAgIGlmIChjb2wgPT0gU0laRSkgewogICAgICAgIHJvdysrOwogICAgICAgIGNvbCA9IDA7CiAgICB9CgogICAgaWYgKGdyaWRbcm93XVtjb2xdICE9IDApCiAgICAgICAgcmV0dXJuIGZpbGxHcmlkKHJvdywgY29sICsgMSk7CgogICAgaW50IG51bXNbU0laRV07CiAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7IGkrKykgbnVtc1tpXSA9IGkgKyAxOwogICAgc2h1ZmZsZShudW1zLCBTSVpFKTsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7IGkrKykgewogICAgICAgIGludCBudW0gPSBudW1zW2ldOwogICAgICAgIGlmIChpc1NhZmUocm93LCBjb2wsIG51bSkpIHsKICAgICAgICAgICAgZ3JpZFtyb3ddW2NvbF0gPSBudW07CiAgICAgICAgICAgIGlmIChmaWxsR3JpZChyb3csIGNvbCArIDEpKQogICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgIGdyaWRbcm93XVtjb2xdID0gMDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDA7Cn0KCi8vIOOCsOODquODg+ODieOBruihqOekugp2b2lkIHByaW50R3JpZCgpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgaSsrKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBTSVpFOyBqKyspIHsKICAgICAgICAgICAgcHJpbnRmKCIlZCAiLCBncmlkW2ldW2pdKTsKICAgICAgICB9CiAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgfQp9CgppbnQgbWFpbigpIHsKICAgIHNyYW5kKHRpbWUoTlVMTCkpOwoKICAgIC8vIOOCsOODquODg+ODieWIneacn+WMlgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyBpKyspCiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBTSVpFOyBqKyspCiAgICAgICAgICAgIGdyaWRbaV1bal0gPSAwOwoKICAgIGlmIChmaWxsR3JpZCgwLCAwKSkgewogICAgICAgIHByaW50Zigi5a6M5oiQ5riI44G/44Gu44OK44Oz44OX44OsOlxuIik7CiAgICAgICAgcHJpbnRHcmlkKCk7CiAgICB9IGVsc2UgewogICAgICAgIHByaW50Zigi44Kw44Oq44OD44OJ44KS55Sf5oiQ44Gn44GN44G+44Gb44KT44Gn44GX44Gf44CCXG4iKTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQ==