第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話へ

トップへ