第7講 左右対称形・上下対称形・点対称形・左右にも上下に対称・ハート型
第8話 ハート型第2案
テキストファイルは一番下にあります。
この図がくどいほど出てくるのは、この図を参照しながら以下を読まないと理解できないからです。
void kokoro(char a) {//ハート型
//以下ハートの外枠 = オレンジ
  int q = 0;//以下0列目
  Y[a][q] = 2;
  X[a][q] = 0;
  q++;
  Y[a][q] = 3;
  X[a][q] = 0;
  q++;
  Y[a][q] = 4;
  X[a][q] = 0;
  q++;

  Y[a][q] = 1;//以下1列目
  X[a][q] = 1;
  q++;
  Y[a][q] = 5;
  X[a][q] = 1;
  q++;
//
  Y[a][q] = 1;//以下2列目
  X[a][q] = 2;
  q++;
  Y[a][q] = 6;
  X[a][q] = 2;
  q++;

  Y[a][q] = 2;//以下3列目
  X[a][q] = 3;
  q++;
  Y[a][q] = 7;
  X[a][q] = 3;
  q++;

  Y[a][q] = 3;//以下4列目
  X[a][q] = 4;
  q++;
  Y[a][q] = 8;
  X[a][q] = 4;
  q++;
//コピペする場合には図は除いてください。
//テキストファイルを使うことをお勧めします。  Y[a][q] = 2;
  X[a][q] = 5;//以下5列目
  q++;
  Y[a][q] = 7;
  X[a][q] = 5;
  q++;

  Y[a][q] = 1;//以下6列目
  X[a][q] = 6;
  q++;
  Y[a][q] = 6;
  X[a][q] = 6;
  q++;
//
  Y[a][q] = 1;//以下7列目
  X[a][q] = 7;
  q++;
  Y[a][q] = 5;
  X[a][q] = 7;
  q++;
//コピペする場合には図は除いてください。
//テキストファイルを使うことをお勧めします。
  Y[a][q] = 2;//以下8列目
  X[a][q] = 8;
  q++;
  Y[a][q] = 3;
  X[a][q] = 8;
  q++;
  Y[a][q] = 4;
  X[a][q] = 8;
  q++;
//以下ヒント数が奇数の場合青から1つ選択
  if (hnt % 2 == 1) {
    X[a][q] = 4;
    Y[a][q] = 4 + rand() % 4;
    q++;
  }
//以下緑から不足する数の分を選択
//左右対称性のために緑を1マス選択するとその対称の位置にあるセルも選択される。
//例えば、29を選択すると33も選択される。
  char p[11] = { 19,28,37,20,29,38,47,30,39,48,57 };
  char st = rand() % 11;
  char tbs[7] = { 3,4,5,6,7,8,9 };
  char tb = tbs[rand() % 7];
  for (char t = 0;; t++) {//互いに素を利用
    Y[a][q] = p[(st + tb * t) % 11] / 9;
    X[a][q] = p[(st + tb * t) % 11] % 9;
    q++;
    Y[a][q] = Y[a][q - 1];
    X[a][q] = 8 - X[a][q - 1];
    q++;
    if (hnt == q)break;
  }
  /*for (char i = 0; i < hnt; i++) {
    cout << +Y[a][i];
    cout << +X[a][i] << " ";
    if (i == 9)cout << endl;
  }*/
  //cout << endl;
  for (char i = 0; i < hnt; i++)sudoku[a][Y[a][i]][X[a][i]] = 1;
}
図を除く作業がうっとうしい方はテキストファイルを利用してください。
ハート型のテキストファイル
テキストファイル自動実験版

テキストファイル手動実験版





第7話へ
 第9話へ

トップへ