コード:
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <ctime>
char t[][4] = {
{2,1}, {2,16}, {3,1,2}, {3,16,32},
{3,1,16}, {3,1,17}, {3,16,17}, {3,15,16},
{4,1,2,3}, {4,16,32,48}, {4,1,16,17},
{4,1,16,32}, {4,1,17,33}, {4,16,32,33}, {4,16,31,32},
{4,1,2,16}, {4,1,2,16}, {4,16,17,18}, {4,14,15,16},
{4,1,2,17}, {4,16,17,32}, {4,15,16,17}, {4,15,16,32},
{4,1,17,18}, {4,15,16,31}, {4,1,15,16}, {4,16,17,33},
};
cont int N = sizeof(t) / sizeof(t[0]);
int b[16 * 16], row, col;
void print()
{
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++)
std::cout << std::setw(4) << b[i*16 + j];
std::endl(std::cout);
}
}
int ok(int r, int c, int i)
{
int n = t[i][0];
for (int j = 1; j < n; j++)
if (b[r*16 + c + t[i][j]]) return 0;
return 1;
}
void set(int r, int c, int i, int k)
{
b[r*16 + c] = k;
int n = t[i][0];
for (int j = 1; j < n; j++)
b[r*16 + c + t[i][j]] = k;
}
void step(int r, int c, int k)
{
if (c == col) {
c = 0;
if (++r == row) { print(); exit(0); }
}
if (b[r*16 + c]) step(r, c+1, k);
else {
b[r*16 + c] = k;
for (int i = 0; i < N; i++) {
if (ok(r, c, i)) {
set(r, c, i, k);
step(r, c+1, k+1);
set(r, c, i, 0);
}
}
b[r*16 + c] = 0;
}
}
int main()
{
std::srand(std::time(0));
std::random_shuffle(t, t+N);
std::cout << "input row and col: ";
std::cin >> row >> col;
if (!std::cin || row >= 16 || col >= 16) return 1;
for (int i = 0; i < row; i++) b[i*16 + col] = 999;
for (int i = 0; i <= col; i++) b[row*16 + i] = 999;
step(0, 0, 1);
}