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

トップへ