#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// ------- 可変設定 --------
#define SIZE 10 // グリッド全体のサイズ(例: 4, 6, 9)
#define BLOCK_H 2 // ブロックの縦のサイズ(例: 2)
#define BLOCK_W 5 // ブロックの横のサイズ(例: 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+v5aSJ6Kit5a6aIC0tLS0tLS0tCiNkZWZpbmUgU0laRSAxMCAgICAgICAgIC8vIOOCsOODquODg+ODieWFqOS9k+OBruOCteOCpOOCuu+8iOS+izogNCwgNiwgOe+8iQojZGVmaW5lIEJMT0NLX0ggMiAgICAgIC8vIOODluODreODg+OCr+OBrue4puOBruOCteOCpOOCuu+8iOS+izogMu+8iQojZGVmaW5lIEJMT0NLX1cgNSAgICAgIC8vIOODluODreODg+OCr+OBruaoquOBruOCteOCpOOCuu+8iOS+izogM++8iQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgppbnQgZ3JpZFtTSVpFXVtTSVpFXTsKCi8vIOODqeODs+ODgOODoOOBqumghueVquOBq+S4puOBs+abv+OBiAp2b2lkIHNodWZmbGUoaW50ICphcnJheSwgaW50IHNpemUpIHsKICAgIGZvciAoaW50IGkgPSBzaXplIC0gMTsgaSA+IDA7IGktLSkgewogICAgICAgIGludCBqID0gcmFuZCgpICUgKGkgKyAxKTsKICAgICAgICBpbnQgdG1wID0gYXJyYXlbaV07CiAgICAgICAgYXJyYXlbaV0gPSBhcnJheVtqXTsKICAgICAgICBhcnJheVtqXSA9IHRtcDsKICAgIH0KfQoKLy8gbnVtIOOCkiAocm93LCBjb2wpIOOBq+e9ruOBhOOBpuOBhOOBhOOBi+WIpOWumgppbnQgaXNTYWZlKGludCByb3csIGludCBjb2wsIGludCBudW0pIHsKICAgIGZvciAoaW50IHggPSAwOyB4IDwgU0laRTsgeCsrKSB7CiAgICAgICAgaWYgKGdyaWRbcm93XVt4XSA9PSBudW0gfHwgZ3JpZFt4XVtjb2xdID09IG51bSkKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgaW50IHN0YXJ0Um93ID0gcm93IC0gcm93ICUgQkxPQ0tfSDsKICAgIGludCBzdGFydENvbCA9IGNvbCAtIGNvbCAlIEJMT0NLX1c7CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBCTE9DS19IOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IEJMT0NLX1c7IGorKykgewogICAgICAgICAgICBpZiAoZ3JpZFtzdGFydFJvdyArIGldW3N0YXJ0Q29sICsgal0gPT0gbnVtKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgovLyDlho3luLDnmoTjgavln4vjgoHjgabjgYTjgY8KaW50IGZpbGxHcmlkKGludCByb3csIGludCBjb2wpIHsKICAgIGlmIChyb3cgPT0gU0laRSAtIDEgJiYgY29sID09IFNJWkUpCiAgICAgICAgcmV0dXJuIDE7CiAgICBpZiAoY29sID09IFNJWkUpIHsKICAgICAgICByb3crKzsKICAgICAgICBjb2wgPSAwOwogICAgfQoKICAgIGlmIChncmlkW3Jvd11bY29sXSAhPSAwKQogICAgICAgIHJldHVybiBmaWxsR3JpZChyb3csIGNvbCArIDEpOwoKICAgIGludCBudW1zW1NJWkVdOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyBpKyspIG51bXNbaV0gPSBpICsgMTsKICAgIHNodWZmbGUobnVtcywgU0laRSk7CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyBpKyspIHsKICAgICAgICBpbnQgbnVtID0gbnVtc1tpXTsKICAgICAgICBpZiAoaXNTYWZlKHJvdywgY29sLCBudW0pKSB7CiAgICAgICAgICAgIGdyaWRbcm93XVtjb2xdID0gbnVtOwogICAgICAgICAgICBpZiAoZmlsbEdyaWQocm93LCBjb2wgKyAxKSkKICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICBncmlkW3Jvd11bY29sXSA9IDA7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAwOwp9CgovLyDlh7rlipvplqLmlbAKdm9pZCBwcmludEdyaWQoKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7IGkrKykgewogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgU0laRTsgaisrKSB7CiAgICAgICAgICAgIHByaW50ZigiJTJkICIsIGdyaWRbaV1bal0pOwogICAgICAgIH0KICAgICAgICBwcmludGYoIlxuIik7CiAgICB9Cn0KCmludCBtYWluKCkgewogICAgc3JhbmQodGltZShOVUxMKSk7CgogICAgLy8g5Yid5pyf5YyWCiAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7IGkrKykKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IFNJWkU7IGorKykKICAgICAgICAgICAgZ3JpZFtpXVtqXSA9IDA7CgogICAgaWYgKGZpbGxHcmlkKDAsIDApKSB7CiAgICAgICAgcHJpbnRmKCLlrozmiJDmuIjjgb/jga7jg4rjg7Pjg5fjg6wgKCVkeCVkLCAlZHglZOODluODreODg+OCryk6XG4iLCBTSVpFLCBTSVpFLCBCTE9DS19ILCBCTE9DS19XKTsKICAgICAgICBwcmludEdyaWQoKTsKICAgIH0gZWxzZSB7CiAgICAgICAgcHJpbnRmKCLjgrDjg6rjg4Pjg4njgpLnlJ/miJDjgafjgY3jgb7jgZvjgpPjgafjgZfjgZ/jgIJcbiIpOwogICAgfQoKICAgIHJldHVybiAwOwp9