マルチスレッド版数独自動生成ソフトC++コードを題材とする超初心者のためのVisual Studio C++講義
第8章 ポインタの学習

第4話 ポインタは2次元配列としても使える

ポインタを2次元配列のように使うコード例

#include<iostream>//インクルードファイルiostreamの読み込み

#include<conio.h>//while(!_kbhit());を使うためのお呪い

#include<string> //文字列変数を使えるようにするために組み込む

#include <iomanip> //setprecisionを使えるように組み込む

#include <cmath>//powなどを使うときに必要

#include <ctime>//time()(←現時刻発生する関数)を使うために必要

using namespace std;//coutを使うときに必要なお呪い

const int n = 10;//具体的な数字を使うのではなく、 n を使うと汎用性のあるプログラムになる!

void 社員1();//ポインタを扱う社員の一人

int main() {//私は社長だ。

  社員1();

  while (!_kbhit());//待機させるための命令

  return 0;//int main() を終わるためのお呪い

}

//ポインタを扱う社員の一人
void 社員1() {

  int* a = (int*)calloc(n * n, sizeof(int));

  for (int i = 0; i < n; i++) {

    for (int j = 0; j < n; j++) {

      *(a + n * i + j) = n * i + j + 1;

    }

  }

  for (int i = 0; i < n; i++) {

    for (int j = 0; j < n; j++) {

      if (*(a + n * i + j) < n)cout << " ";

      cout << *(a + n * i + j) << " ";

    }

    cout << endl;

  }

}

解説

2次元は1次元に還元できるのです。

したがって、工夫すればポインタを2次元配列のように使うこともできるということです。

2次元を1次元に還元することは数独自動生成ソフト開発において肝となる部分です。

そして、第10章で3次魔方陣と4次魔方陣の自動生成においても肝となります。

私の発展史では魔方陣の自動生成を研究していて、

数独の存在を知り、

すぐに魔方陣自動生成を応用すれば、

数独の自動生成にできるはずだと直観して、

予想通り1週間も研究すると数独の自動生成に成功しています。

ただし、試行錯誤法によるもので4題に1題の割合で仮定法を使わないと解けない問題を生成していることがわかり、

理詰めで解ける問題のみを生成するために改良を加え

(↑これは苦戦の連続でした。結局理詰め解法エンジンを開発するためには、

人間と同じ思考方法でコンピュータに思考させる必要があり、

根本的な改良になり苦戦することになったのです)、

現在南信州新聞と下野新聞に無料提供するに至ったわけです。

本講義基礎編は第10章の3次魔方陣自動生成と4次魔方陣自動生成をもって終了して、

第2部がマルチスレッド版数独自動生成ソフトの開発 第3部が推薦書自動生成を含む実用的なソフトの開発を予定しています。

魔方陣の自動生成が推薦書自動生成にもつながるのです。

ここまでついてきた読者なら魔方陣自動生成がキーとなるテーマとなることは、

理解できると思います。

魔方陣自動生成が数独自動生成と推薦書自動生成更に時間割作成に繋がるわけです。

再度肝を確認しておきます。

2次元は1次元に還元できる!

つまり、第1部が基礎編で第2部と第3部が応用編というわけです。

第3部では成績一覧表も扱います。

総合点や各教科別の並び替えも成績一覧表において重要な要素となります。





第8章第3話へ 第8章第5話へ

本講義トップへ