#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// ------- 可変設定 --------
#define SIZE 6 // グリッド全体のサイズ(例: 4, 6, 9)
#define BLOCK_H 2 // ブロックの縦のサイズ(例: 2)
#define BLOCK_W 3 // ブロックの横のサイズ(例: 3)
// -------------------------
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;
}
}
// num を (row, col) に置いていいか判定
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 % BLOCK_H;
int startCol = col - col % BLOCK_W;
for (int i = 0; i < BLOCK_H; i++) {
for (int j = 0; j < BLOCK_W; 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)) {
printf("完成済みのナンプレ (%dx%d, %dx%dブロック):\n", SIZE
, SIZE
, BLOCK_H
, BLOCK_W
); printGrid();
} else {
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHRpbWUuaD4KCi8vIC0tLS0tLS0g5Y+v5aSJ6Kit5a6aIC0tLS0tLS0tCiNkZWZpbmUgU0laRSA2ICAgICAgICAgLy8g44Kw44Oq44OD44OJ5YWo5L2T44Gu44K144Kk44K677yI5L6LOiA0LCA2LCA577yJCiNkZWZpbmUgQkxPQ0tfSCAyICAgICAgLy8g44OW44Ot44OD44Kv44Gu57im44Gu44K144Kk44K677yI5L6LOiAy77yJCiNkZWZpbmUgQkxPQ0tfVyAzICAgICAgLy8g44OW44Ot44OD44Kv44Gu5qiq44Gu44K144Kk44K677yI5L6LOiAz77yJCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmludCBncmlkW1NJWkVdW1NJWkVdOwoKLy8g44Op44Oz44OA44Og44Gq6aCG55Wq44Gr5Lim44Gz5pu/44GICnZvaWQgc2h1ZmZsZShpbnQgKmFycmF5LCBpbnQgc2l6ZSkgewogICAgZm9yIChpbnQgaSA9IHNpemUgLSAxOyBpID4gMDsgaS0tKSB7CiAgICAgICAgaW50IGogPSByYW5kKCkgJSAoaSArIDEpOwogICAgICAgIGludCB0bXAgPSBhcnJheVtpXTsKICAgICAgICBhcnJheVtpXSA9IGFycmF5W2pdOwogICAgICAgIGFycmF5W2pdID0gdG1wOwogICAgfQp9CgovLyBudW0g44KSIChyb3csIGNvbCkg44Gr572u44GE44Gm44GE44GE44GL5Yik5a6aCmludCBpc1NhZmUoaW50IHJvdywgaW50IGNvbCwgaW50IG51bSkgewogICAgZm9yIChpbnQgeCA9IDA7IHggPCBTSVpFOyB4KyspIHsKICAgICAgICBpZiAoZ3JpZFtyb3ddW3hdID09IG51bSB8fCBncmlkW3hdW2NvbF0gPT0gbnVtKQogICAgICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBpbnQgc3RhcnRSb3cgPSByb3cgLSByb3cgJSBCTE9DS19IOwogICAgaW50IHN0YXJ0Q29sID0gY29sIC0gY29sICUgQkxPQ0tfVzsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IEJMT0NLX0g7IGkrKykgewogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgQkxPQ0tfVzsgaisrKSB7CiAgICAgICAgICAgIGlmIChncmlkW3N0YXJ0Um93ICsgaV1bc3RhcnRDb2wgKyBqXSA9PSBudW0pCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCi8vIOWGjeW4sOeahOOBq+Wfi+OCgeOBpuOBhOOBjwppbnQgZmlsbEdyaWQoaW50IHJvdywgaW50IGNvbCkgewogICAgaWYgKHJvdyA9PSBTSVpFIC0gMSAmJiBjb2wgPT0gU0laRSkKICAgICAgICByZXR1cm4gMTsKICAgIGlmIChjb2wgPT0gU0laRSkgewogICAgICAgIHJvdysrOwogICAgICAgIGNvbCA9IDA7CiAgICB9CgogICAgaWYgKGdyaWRbcm93XVtjb2xdICE9IDApCiAgICAgICAgcmV0dXJuIGZpbGxHcmlkKHJvdywgY29sICsgMSk7CgogICAgaW50IG51bXNbU0laRV07CiAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7IGkrKykgbnVtc1tpXSA9IGkgKyAxOwogICAgc2h1ZmZsZShudW1zLCBTSVpFKTsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7IGkrKykgewogICAgICAgIGludCBudW0gPSBudW1zW2ldOwogICAgICAgIGlmIChpc1NhZmUocm93LCBjb2wsIG51bSkpIHsKICAgICAgICAgICAgZ3JpZFtyb3ddW2NvbF0gPSBudW07CiAgICAgICAgICAgIGlmIChmaWxsR3JpZChyb3csIGNvbCArIDEpKQogICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgIGdyaWRbcm93XVtjb2xdID0gMDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDA7Cn0KCi8vIOWHuuWKm+mWouaVsAp2b2lkIHByaW50R3JpZCgpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgaSsrKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBTSVpFOyBqKyspIHsKICAgICAgICAgICAgcHJpbnRmKCIlMmQgIiwgZ3JpZFtpXVtqXSk7CiAgICAgICAgfQogICAgICAgIHByaW50ZigiXG4iKTsKICAgIH0KfQoKaW50IG1haW4oKSB7CiAgICBzcmFuZCh0aW1lKE5VTEwpKTsKCiAgICAvLyDliJ3mnJ/ljJYKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgaSsrKQogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgU0laRTsgaisrKQogICAgICAgICAgICBncmlkW2ldW2pdID0gMDsKCiAgICBpZiAoZmlsbEdyaWQoMCwgMCkpIHsKICAgICAgICBwcmludGYoIuWujOaIkOa4iOOBv+OBruODiuODs+ODl+ODrCAoJWR4JWQsICVkeCVk44OW44Ot44OD44KvKTpcbiIsIFNJWkUsIFNJWkUsIEJMT0NLX0gsIEJMT0NLX1cpOwogICAgICAgIHByaW50R3JpZCgpOwogICAgfSBlbHNlIHsKICAgICAgICBwcmludGYoIuOCsOODquODg+ODieOCkueUn+aIkOOBp+OBjeOBvuOBm+OCk+OBp+OBl+OBn+OAglxuIik7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0=