第7講 左右対称形・上下対称形・点対称形・左右にも上下に対称・ハート型
第5話 点対称形のコード例
を実現するプロジェクト例
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 tentaisyou(char a) {
int q = 0;
if (hnt % 2 == 1) {
mondai[a][4][4] = sudoku[a][4][4];
gensudoku[a][4][4] = sudoku[a][4][4];
q++;
}
char b = rand() % 2;
if (b == 1) {
char d = rand() % 5;
mondai[a][4][d] = sudoku[a][4][d];
q++;
gensudoku[a][4][d] = sudoku[a][4][d];
q++;
mondai[a][4][8 - d] = sudoku[a][4][8 - d];
q++;
gensudoku[a][4][8 - d] = sudoku[a][4][8 - d];
q++;
}
char hb; //部屋番号
char tbs[6] = { 5,11,13,17,19,23 }; //飛びの選択肢
//素数であれば36と互いに素は保証されている
char st = rand() % 36; //始めの位置
char tb = tbs[rand() % 6]; //飛び
char h = 0; //可否の否
char* gohr = (char*)calloc(hnt, sizeof(char));
for (char t = 0; t < hnt - q; t++) {
gohr[t] = (st + t * tb) % 36;
}
for (char j = 0; j < 4; j++) {
for (char k = 0; k < n; k++) {
if (keizoku == 0)return;
hb = n * j + k; //部屋番号の再初期化 = 空欄の数字候補の個数の小さい順に入れる
char h = 0; //可否の否
for (char t = 0; t < (hnt - q) / 2; t++) {
if (gohr[t] == hb) {
h = 1;//可否の可
break;
}
}
if (h == 1) {
mondai[a][j][k] = sudoku[a][j][k];
mondai[a][8 - j][8 - k] = sudoku[a][8 - j][8 - k];
gensudoku[a][j][k] = sudoku[a][j][k];
gensudoku[a][8 - j][8 - k] = sudoku[a][8 - j][8 - k];
}
}
}
free(gohr); //メモリ解放
}
テキストファイル
次の課題は左右にも上下にも対称 = 線対称かつ点対称の実現です。
第4話へ 第6話へ
トップへ