第7講 左右対称形・上下対称形・点対称形・左右にも上下に対称・ハート型
第6話 左右にも上下にも対称(完全対称)
を実現するプロジェクト例
char main() {
・
・
・
hyg(A);
hys(A);
char k = 0;
for (unsigned char i = 0; i < n; i++) {
for (unsigned char j = 0; j < n; j++) {
if (gensudoku[A][i][j] > 0)k++;
}
}
cout << "数字が入っているものをカウント"<< + k << endl;
cout << "ヒント数"<< + hnt << endl;
・
・
・
void sayujyogetaisyou(char a) {
int q = 0;
if (hnt % 4 == 0) {
while (1) {
char b = rand() % 2;
if (b == 0) {
char d = rand() % 4;
mondai[a][4][d] = sudoku[a][4][d];
mondai[a][4][8 - d] = sudoku[a][4][8 - d];
q += 2;
}
if (q == 0)break;
b = rand() % 2;
if (b == 1) {
char d = rand() % 4;
mondai[a][d][4] = sudoku[a][d][4];
mondai[a][8 - d][4] = sudoku[a][8 - d][4];
q += 2;
}
if (q == 0 || q == 4)break;
}
}
if (hnt % 4 == 2) {
while (1) {
char b = rand() % 2;
if (b == 0) {
char d = rand() % 4;
mondai[a][4][d] = sudoku[a][4][d];
mondai[a][4][8 - d] = sudoku[a][4][8 - d];
q += 2;
}
b = rand() % 2;
if (q == 2)break;
if (b == 1) {
char d = rand() % 4;
mondai[a][d][4] = sudoku[a][d][4];
mondai[a][8 - d][4] = sudoku[a][8 - d][4];
q += 2;
}
if (q == 2 || q == 6)break;
}
}
if (hnt % 4 == 1) {
mondai[a][4][4] = 1;
q++;
while (1) {
char b = rand() % 2;
if (b == 0) {
char d = rand() % 4;
mondai[a][4][d] = sudoku[a][4][d];
mondai[a][4][8 - d] = sudoku[a][4][8 - d];
q += 2;
}
b = rand() % 2;
if (b == 1) {
char d = rand() % 4;
mondai[a][d][4] = sudoku[a][d][4];
mondai[a][8 - d][4] = sudoku[a][8 - d][4];
q += 2;
}
if (q == 1 || q == 5)break;
}
}
if (hnt % 4 == 3) {
mondai[a][4][4] = sudoku[a][4][4];
q++;
while (1) {
char b = rand() % 2;
if (b == 0) {
char d = rand() % 4;
mondai[a][4][d] = sudoku[a][4][d];
mondai[a][4][8 - d] = sudoku[a][4][8 - d];
q += 2;
}
if (q == 3)break;
b = rand() % 2;
if (b == 1) {
char d = rand() % 4;
mondai[a][d][4] = sudoku[a][d][4];
mondai[a][8 - d][4] = sudoku[a][8 - d][4];
q += 2;
}
if (q == 3)break;
}
}
char hb; //部屋番号
char tbs[5] = { 3,5,7,11,13 };//飛びの選択肢
//素数であれば16と互いに素は保証されている
char st = rand() % 16; //始めの位置
char tb = tbs[rand() % 5]; //飛び
char h = 0; //可否の否
char* gohr = (char*)calloc(hnt, sizeof(char));
for (char t = 0; t < hnt - q; t++) {
gohr[t] = (st + t * tb) % 16;
}
for (char j = 0; j < 4; j++) {
for (char k = 0; k < 4; k++) {
if (keizoku == 0)return;
hb = 4 * j + k; //部屋番号の再初期化 = 空欄の数字候補の個数の小さい順に入れる
char h = 0; //可否の否
for (char t = 0; t < (hnt - q) / 4; t++) {
if (gohr[t] == hb) {
h = 1;//可否の可
break;
}
}
if (h == 1) {
mondai[a][j][k] = sudoku[a][j][k];
mondai[a][8 - j][k] = sudoku[a][8 - j][k];
mondai[a][j][8 - k] = sudoku[a][j][8 - k];
mondai[a][8 - j][8 - k] = sudoku[a][8 - j][8 - k];
}
}
}
free(gohr); //メモリ解放
for (char j = 0; j < n; j++) {
for (char k = 0; k < n; k++) {
gensudoku[a][j][k] = mondai[a][j][k];
}
}
}
テキストファイル
尚、左右にも上下にも対称を完全対称と呼称します。
次話への課題はの実現です。
第5話へ 第7話へ
トップへ