第2講 試行錯誤法でヒント数0数独の解答を作る(1)
第4話 5次順列自動生成ソフト
1,2,3,4,5の順列自動生成
・
・
第2話の回答
#include<iostream>
using namespace std;
int main() {
int a[5], cn = 0;
for (int i = 1; i < 6; i++) {
a[0] = i; //a[0]に1,2,3, 4, 5を入力
for (int j = 1; j < 6; j++) {
if (j != a[0]) {
a[1] = j; //a[0]とa[1]に同じ数字が入らないときに1,2,3, 4, 5を入力
for (int k = 1; k < 6; k++) {
if (k != a[0] && k != a[1]) {
a[2] = k; //a[0]とa[1]とa[2]に同じ数字が入らないときに1,2,3, 4, 5を入力
for (int l = 1; l < 6; l++) {
if (l != a[0] && l != a[1] && l != a[2])
{
a[3] = l; //a[0]とa[1]とa[2]とa[3]のすべてに同じ数字入らないときに1,2,3, 4,
5を入力
for (int m = 1; m < 6; m++) {
if (m != a[0] && m != a[1] && m !=
a[2] && m != a[3]) {
a[4] = m; //a[0]とa[1]とa[2]とa[3]とのすべてに同じ数字入らないときに1,2,3,
4, 5を入力
cn++;
cout << a[0] << " " <<
a[1] << " " << a[2] << " " <<
a[3] << " " << a[4] << endl;
}
}
}
}
}
}
}
}
}
cout << "順列の場合の数は" << cn << endl;
cout << "プロジェクト成功" << endl;
return(0);
}
皆さんどうですか。
頭が混乱しませんか。
数独は81マスですから、
81次元のプログラムをやりたい人は当然いないですよね。
私もやりたくありません。
for文の81次元展開なんて冗談ではないですよね。
ですが、81次元展開を簡単に実現する方法があるのですよ。
ヒントは
この図です。だたし、第6次順列の場合には、
です。上の番号は部屋番号で、
下はその部屋に泊まるお客さんです。
各部屋は1人部屋なので1人しか泊まれません。
部屋番号について再帰的使用をすれば、複雑極まりなかったプログラムコードは信じられないほど、
すっきりした形になります。
でもここでもいきなりは無理ですから、
次話で考え方を説明します。
第3話へ 第5話へ