(57)【要約】【課題】  平面上に複数の要素配置場所を用意し、提示された複数個のグループの各要素をその上に配置するパズルにおいて、配置組み合わせの中から唯一解を探し出す、図形的な興趣性と複雑性に富んだパズルゲームを提供する。【解決手段】  各要素配置場所がどの要素配置場所と隣接するかが定義されている平面上で、提示された各グループの第１要素は独立して配置可能で、第２要素以降は直前の要素に隣接して配置可能で、異なるグループの同一要素は同一配置場所で重ねて配置可能という条件を満たして、配置場所に空きが無いように全要素を配置する唯一解をあらかじめコンピュータで算出し、その中からパズルを出題する。【選択図】図１
2013078484.tif 000002
【特許請求の範囲】
【請求項１】
複数の要素配置場所が描かれ、その各々が他の要素配置場所との隣接有無が定義されている平面と、順序を有する要素の集合であるグループが複数個提示されて、各要素を要素配置場所に配置する際に、要素が置かれていない要素配置場所が無いように、同一グループに属する要素は同一であっても１つの要素配置場所に重ねて配置することはできないが、異なるグループに属する同一の要素は１つの要素配置場所に重ねて配置することができ、各グループの要素を隣接する要素配置場所に順序に従い連続して配置するというルールのパズルの問題を提供するために、
要素配置場所や要素の初期条件と、配置が唯一解になるための制約条件を入力する機能と、
入力された初期条件と制約条件をメモリに読み込み、メモリに割り当てた要素配置場所と各要素の配置組み合わせを保存する領域に、初期条件と制約条件とルールを満たすすべての配置組み合わせを実現し、その中から要素配置場所と各要素の配置組み合わせが唯一解になるかどうかを判定する制御演算機能と、
その唯一解の要素配置場所と要素の配置組み合わせデータを出力する機能と、
を備えた要素配置唯一解算出装置。
【請求項２】
第１段階として、提示された要素配置場所と要素の初期条件とルールを満たす要素配置場所と要素の配置組み合わせをレコードとして出力し、
第２段階として、上記配置組み合わせレコードのうち、選択された重なり要素関係分類（要素と別の要素が任意の要素配置場所で重なっている関係で、その和集合、積集合、空集合を含む）のレコードを抽出し、さらに一部の要素を要素配置場所へあらかじめ配置することによる制約条件を満足する配置組み合わせレコードが唯一解になるかどうかを判定し、唯一解であれば要素と要素配置場所の組み合わせデータを出力する二段階方式要素配置唯一解算出プログラムを備えた請求項１の要素配置唯一解算出装置。
【請求項３】
ルール、要素配置場所と要素の初期条件および、一部の要素を要素配置場所へあらかじめ配置することによる制約条件を満たす配置組み合わせが唯一解になるかどうかを判定し、唯一解であれば要素と要素配置場所の組み合わせデータを出力する一段階方式要素配置唯一解算出プログラムを備えた請求項１の要素配置唯一解算出装置。
【請求項４】
要素配置場所間の隣接定義を画面から又はテキストファイルの読み込みによって設定することを可能にした要素配置唯一解算出プログラムを備えた請求項１の要素配置唯一解算出装置。
【請求項５】
一部の要素を要素配置場所へあらかじめ配置することによる制約条件が、唯一解を探す際に適用する各種制約条件の適応優先順位である要素配置唯一解算出プログラムを備えた請求項２の要素配置唯一解算出装置。
【請求項６】
配置が唯一解になるための制約条件の一部または全部が、要素と要素が隣接可能かどうかの定義である要素配置唯一解算出プログラムを備えた請求項１の要素配置唯一解算出装置。
【請求項７】
複数の要素配置場所が描かれ、その各々に対し他の要素配置場所との隣接有無が定義されている平面と、順序を有する要素の集合であるグループが複数個提示されて、各要素を要素配置場所に配置する際に、要素が置かれていない要素配置場所が無いように、同一グループに属する要素は同一であっても１つの要素配置場所に重ねて配置することはできないが、異なるグループに属する同一の要素は１つの要素配置場所に重ねて配置することができ、各グループの要素を隣接する要素配置場所に順序に従い連続して配置するというルールのパズルの問題を、一部の要素の要素配置場所への配置や要素と要素が隣接可能かどうかの定義による制約条件により、唯一解となることがあらかじめ確かめられている配置組み合わせの中から出題するパズルゲームの提供方法。
【請求項８】
複数の要素配置場所が縦横に隣接する縦４列横４行の１６個のマス目で、順序を有する要素の集合であるグループが３つの句からなる俳句で、その要素がモーラ（一定の時間的長さをもった音の分節単位）であり、制約条件がその俳句の中のいくつかのモーラを要素配置場所へ初期配置することである請求項７のパズルゲームの提供方法。
【請求項９】
複数の要素配置場所が縦横に隣接する縦５列横６行または縦６列横５行の３０個のマス目で、順序を有する要素の集合であるグループが５つの句からなる短歌で、その要素がモーラであり、制約条件がその短歌の中のいくつかのモーラを要素配置場所へ初期配置することである請求項７のパズルゲームの提供方法。
【請求項１０】
複数の要素配置場所が現実の地理区域すなわち国、都道府県、又は駅・港の隣接有無に基づいて作成された要素配置場所で、順序を有する要素の集合であるグループが都市や観光地を巡る旅程又は交通ダイヤで、その要素が国、都道府県、都市、観光地又は駅・港であり、制約条件がいくつかの要素を要素配置場所へ初期配置するか、要素間の隣接可否か、又はその双方である請求項７のパズルゲームの提供方法。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、提示された複数のグループの要素を平面に配置する唯一の方法を算出する装置に関し、また、それに基づくパズルへの応用方法に関する。
【背景技術】
【０００２】
縦横に区切られたマス目に文字を置く代表的なパズルにクロスワードパズルがあり、ヒントから語句を推理し、ヒントで指定されたマス目位置に、縦横の語句の共通文字がクロスするマス目で重なるように語句をマス目に割り当てていくゲームであり、クロスワードパズルを自動生成する装置が考案されている（特許文献１）。
【０００３】
また、縦４列横４行の１６個のマス目に区切られた画面を、与えられたヒントに基づいて分割するゲーム（特許文献２）が考案されている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特許公開平８‐３０９０２１
【特許文献２】特許公開２０１０‐０７５３４７
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、特許文献１の考案は、ヒントから語句を推測し、その長さや縦横の関係から適当な語句を探し出すことに興趣の中心があり、また、文字の置き方は縦横いずれかの一直線上であり、図形的な興趣性に欠ける。
【０００６】
また、唯一解に基づく出題ではないので、語句ごとにヒントを用意し、配置位置も指定する必要がある。
【０００７】
また、出題をコンピュータで自動的に行うためには、相当数の語句とヒントを予めデータベースとして用意しておく必要がある。
【０００８】
特許文献２の考案は、縦横に区切られたマス目にグループの要素を配置する唯一の方法を見つけ出すパズルという点では当発明と同じだが、縦４列横４行のマス目をテトロミノという４つの連続する正方形を要素とする図形で４つに分割するパズルであり、マス目の縦横の数が４に固定され、マス目の上の要素の重なりを認めず、グループの数と各グループの要素数が任意に設定できないため、グループの要素をマス目に置く配置組み合わせ数が少なく、パズルとしての応用の広さと複雑性に欠ける。
【０００９】
そこで、この発明は平面上に複数の要素配置場所があって、各要素配置場所がどの要素配置場所と隣接するかがあらかじめ定義（以下「隣接定義」という）されていて、提示された複数個のグループ（語句や数字列、旅程、鉄道ダイヤ、製品供給物流連鎖等）の順序を有する要素（文字や数字、観光地、鉄道停車駅、製品供給物流企業等）をその要素配置場所に配置する際に、
（１）  各グループ単位に隣接する要素配置場所に順序に従い連続して配置する。
（２）  要素が置かれていない要素配置場所が無いようにする。
（３）  同一グループに属する要素は同一であっても１つの要素配置場所に重ねて配置することはできない。
（４）  異なるグループに属する同一の要素は１つの要素配置場所に重ねて配置することができる。
というルールに基づく要素配置場所と要素の配置組み合わせの中で、制約条件として一部の要素の要素配置場所をあらかじめ指定するか、又は、要素と要素が隣接可能かどうかの定義（以下「要素間隣接定義」という）を設定することで、唯一の配置法になるような解（以下「唯一解」という）を算出する装置を提供し、また、唯一解を基にパズルを提供することを課題とする。
【課題を解決するための手段および発明の効果】
【００１０】
最初に、唯一解の算出装置について説明し、その後にその唯一解を利用したパズルの提供方法について説明する。平面上での要素配置場所の配置形状は、要素配置場所の数および隣接定義（以下「配置場所位相」という）で表現するが、配置形状がマス目の場合は簡単のために列数と行数で表すこととする。
【００１１】
唯一解の算出装置は、指定されたパターン分類（配置場所位相又はマス目の列数と行数、および各グループの要素数を特定する分類）において、あらかじめ一部の要素の要素配置場所への配置又は要素間隣接定義又はその両方（以下「制約条件」という）を指定した状態のもとで、唯一解かどうかを判定する。
【００１２】
配置場所位相又はマス目の列数と行数（以下「配置場所形状」という）と、グループ数と各グループの要素数（以下「グループ要素数」という）を入力するための入力部と、計算実行命令を受けて、提示されたグループの要素を要素配置場所に配置するすべての組み合わせをパターン分類ごとに算出する制御部と、その結果をレコードとして出力する出力部を備えた配置組み合わせ出力部（一段階部分）と、
配置組み合わせ出力結果に対し、パターン分類と重なり要素関係分類（下記参照）を選択し、唯一解にするための各種制約条件、又はその適用優先順位を指定する入力部と、計算実行命令を受けて、指定された制約条件を満たす唯一解を算出する制御部と、その結果をレコードとして出力する出力部を備えた唯一解出力部（二段階部分）と、
の２つの部分から構成される二段階方式唯一解算出装置およびプログラムを提供する。
【００１３】
ここで「重なり要素関係分類」とは、グループ番号と要素番号で特定する要素と別の要素とが任意の要素配置場所で重なっている関係で、その積集合（複数の関係が同時に成り立つ）、和集合（いずれかの関係が成り立つ）、および重なりのない集合（空集合）を含めての関係である。
【００１４】
従って、所望のパターン分類と重なり要素関係分類ごとの唯一解を算出し、一度に多数の唯一解レコードとして出力することができ、そこからパズル問題を多数作成することができる。
【００１５】
全グループの要素数の合計から要素配置場所数を差し引いた数（以下、「重なり数」という）や要素配置場所数が大きくなると二段階方式による唯一解算出はパソコンの能力を超えたものになる。
【００１６】
例えば、要素配置場所が縦４列横４行の１６個のマス目の場合、要素のマス目への置き方の組み合わせ数は、第１グループの要素数が７、第２グループの要素数が５、第３グループの要素数が４、第４グループの要素数が３（以下「要素７−５−４−３」と表す）の場合は１８，６１６，３２０、要素７−４−４−４の場合は２５，８７３，１５２となり、重なり数が４になると、さらに大きな数になる（図４参照）。また、要素配置場所が縦４列横４行より大きくなる場合も同様である。そこで、簡易な唯一解算出方式としての一段階方式について次に説明する。
【００１７】
パターン分類、すなわち配置場所形状とグループ要素数、および制約条件の入力部と、
計算実行命令を受けて、パターン分類および制約条件のもとで要素を要素配置場所に配置する唯一解かどうかの判定を行う制御部と、
唯一解であればその結果を唯一解レコードとして出力する出力部と、
を備えた一段階方式唯一解算出装置およびプログラムを提供する。従って、所望の制約条件のもとで唯一解になるかどうかを短時間で判定できる。
【００１８】
要素の要素配置場所への配置の組み合わせ算出については、
各グループの第１要素は他の要素の配置に関わらず配置場所のいずれにも配置することができ（以下この性質を「独立性」という）、
第２要素以降はその属するグループの直前の要素が配置された配置場所に隣接する配置場所（マス目の場合は上下左右のいずれかに隣接するマス目）にしか置けない（以下この性質を「従属性」という）
というルールに基づいているという特徴を有する。
従って、以下のような自然現象や社会現象をパズルとしてモデル化することが可能になる。また、唯一解の条件を満たしたとき、両者の間には１対１対応が成り立つことになり、両者間での双方向の変換が可能になり、様々な現象を分類整理する手法を提供することも可能になる。
【００１９】
独立性を有する第１要素と従属性を有する第２要素以下の配置の例として、水面に発生する波を考えれば、石が投げ込まれるなどしてある位置で発生した波は隣接する位置に波を伝えながら広がっていく。その際に、複数の波はある位置では重なり合うことになる。この現象を水面の各位置が要素配置場所で、グループが波、グループの要素がエネルギーとしてモデル化することが可能になる。
【００２０】
他の例として、ある島の都市に電車等の交通機関のダイヤ（運行路線）を考える際、島の都市が要素配置場所、運行路線がグループ、その停車駅が要素となる。この場合、すべての都市にいずれかの交通機関の駅を置くとした場合に、どのような組み合わせがあるかをモデル化して扱うことが可能になる。
【００２１】
また、他の例として、複数の製品の供給物流連鎖について、地域が要素配置場所、製品がグループ、その供給物流拠点が要素となる。この場合、重なりがあるのはその地域の拠点が複数の製品に部品あるいはサービスを提供していることを意味する。
【００２２】
グループの第１要素の独立性と、第２要素以降も同じグループの上位要素に従属するのみであることから、要素配置に関しグループ間で影響を及ぼし合うことはないので、順序は意味を持たない、すなわち、どのグループから配置しても組み合わせは同一になるので、各グループの要素数は、グループ順に対して降順という取り決めにしても問題はない。同じ文字数の場合は提示されたグループの並びに従う。
【００２３】
この発明は、配置場所形状とグループ要素数を画面又はテキストデータの読み込みにより設定することが可能で、その設定に基づいて複数のグループの各要素を要素配置場所に配置する方法が制約条件のもとで唯一の配置法かどうかをコンピュータで算出することを特徴とする。従って、任意の形状の要素配置場所に対するパズルの問題を作成することができる。
【００２４】
この発明、隣接定義を双方向又は単方向のいずれでも画面又はテキストデータの読み込みにより設定できることを特徴とする。従って、要素配置場所間の双方向、単方向いずれかの隣接関係が定まっている要素配置場所のパズル問題を作成することができる。
【００２５】
この発明は、要素間隣接定義を双方向又は単方向のいずれでも画面又はテキストデータの読み込みにより設定することが可能で、その設定に基づいて複数のグループの各要素を要素配置場所に配置する方法が制約条件のもとで唯一の配置法かどうかをコンピュータで算出することを特徴とする。従って、要素間の隣接可否が何らかの決め事によって定まっているパズルの問題を作成することができる。
【００２６】
二段階方式は、第一段階で所望のパターン分類のすべての配列組み合わせをレコードとして出力し、第二段階でその中から唯一の配置法になるための制約条件を、各種制約条件の適用優先順位を指定することで、唯一解になるための必要最小限の制約条件を満たす唯一解を一度に多数見つけ出すことができることを特徴とする。従って、必要最小限の制約条件による難易度の高い問題を多数作成できる。
【００２７】
二段階方式は、上記の唯一の配置法を、重なり要素関係分類をキーにして分類した配置組み合わせレコードの中から見つけ出すことを特徴とする。従って、パズルで提示するグループ要素間の共通要素により決定される要素関係分類キーを有する唯一解を問題として利用することができる。
【００２８】
一段階方式は、制約条件として、画面において１つ又は複数の要素配置場所に配置する要素をコンボボックスで指定しながら、唯一の配置法を短時間で探し出せることを特徴とする。従って、パズルとして面白そうな制約条件が唯一の配置法になるかどうかを判定し、問題としての利用可否を決定できる。
【００２９】
この発明は、要素配置場所間の隣接有無を定める隣接定義に加えて、要素と要素の関係における隣接可否を定める要素間隣接定義を制約条件として使用できることを特徴とする。従って、要素が地理区分（国、州、都道府県、星座など）のように、２つの地理区分同士が地理的に現実に隣接しているかどうかが定まっている場合は、その関係を制約条件として使用できる。
【００３０】
この発明は、要素配置唯一解算出プログラムにおいて再帰関数を使用することにより、どのような配置場所形状に対しても、プログラムを修正すること無しに対応することができることを特徴とする。
【００３１】
この発明は、上記の唯一の配置法を基に、俳句のモーラを縦４列横４行に区切られたマス目に配置するパズルに関して、いくつかのモーラをあらかじめマス目に配置することにより唯一解となる配置組み合わせを見つけ出すパズル問題を提供することを可能にする。ここでモーラとは、一定の時間的長さをもった音の分節単位である。例えば「ハクチョウ」は「ハ」「ク」「チョ」「ウ」という４つのモーラからなり、小書きのヤ、ユ、ヨといった拗音はモーラの単位にはならない。字足らずの１６モーラの俳句なら重なり箇所は無く、字余りの１８モーラの俳句なら重なり箇所は２箇所になる。
【００３２】
この発明は、上記の唯一の配置法を基に、短歌のモーラを縦６列横５行又は縦５列横６行に区切られたマス目に配置するパズルに関して、いくつかのモーラをあらかじめマス目に配置することにより唯一解となる配置組み合わせを見つけ出すパズル問題を提供することを可能にする。
【００３３】
この発明は、上記の唯一の配置法を基に、地理区分、天球区分（星座）、又はそれに属する都市、観光地、市町村、天体を要素とし、複数の旅程（移動順序）をグループとして提示し、現実の地理区域や天球区分に基づいて平面上に作成された複数の要素配置場所に配置するパズルに関して、唯一解の配置組み合わせを見つけ出すパズル問題を提供することを可能にする。
【００３４】
この発明は、上記の唯一の配置法を基に、駅や港を要素とし、複数の駅や港を停車する列車や船舶航空機のダイヤをグループとして提示し、現実の駅や港の路線に基づいて平面上に作成された複数の要素配置場所に配置するパズルに関して、唯一解の配置組み合わせを見つけ出すパズル問題を提供することを可能にする。
【００３５】
この発明において、「入力部」とはキーボード０４（図１２）又はそれと同様の機能を有するマウス等を使用してディスプレイ０３に表示された画面の入力項目にキーインあるいはコンボボックス等を選択することによって、又はテキストファイルから、メモリ０２に外部データを取り込むインターフェイスをいう。
【００３６】
この発明において、「制御部」とは、実施形態ではＣＰＵ０５が該当する。
【００３７】
この発明において、「出力部」とは、実施形態では配置組み合わせレコードや唯一解レコードの出力先である外部メモリ０１又はそれを人間が認識できる形式で表示するディスプレイ０３、又はプリンタ０６が該当する。
【図面の簡単な説明】
【００３８】
【図１】提示された五七五の俳句を縦４列横４行のマス目に配置するパズルの実施例を示す図である。２列１行目のマス目で、第２句（第１グループ）の第４モーラ（第４要素）と第３句（第３グループ）の第５モーラ（第５要素）の共通要素「と」が重なっている。この出題では、提示された俳句（ａ）を各グループの第１要素の配置をあらかじめ制約条件として設定する（ｂ）ことにより、配置組み合わせ（ｃ）は唯一解になっている。
【００３９】
【図２】語句のマス目への配置のルールを例示する図である。（ａ）は直線配置のみが可能なクロスワードの例。（ｂ）は隣接するマス目へ連続して配置できる当パズルで採用されている配置ルールである。（ｃ）は（ｂ）と同様の配置ルールで１３文字（オオニジュウヤホシテントウ）を配置する例である。
【００４０】
【図３】グループ要素数別の配置組み合わせ数を示す表で、マス目が縦３列横３行以内の例である。
【００４１】
【図４】グループ要素数別の配置組み合わせ数を示す表で、マス目が縦４列横４行の場合である。
【００４２】
【図５】グループ要素数別の配置組み合わせ数を示す表で、マス目が縦５列横４行の場合と縦５列横５行の場合である。
【００４３】
【図６】縦４列横４行のマス目に複数グループの要素を配置する場合における配置組み合わせレコードの項目レイアウトである。このレコードは各マス目の配置要素と重なりの位置と要素を保存する。図７のレコードと同時に作成する。この実施例では重なり数の最大値を６としている。
【００４４】
【図７】縦４列横４行のマス目に要素７−５−５を配置する場合における配置組み合わせレコードの項目レイアウトである。このレコードは各要素のマス目位置と重なりの位置と要素を保存する。図６のレコードと同時に作成する。
【００４５】
【図８】唯一解レコードの項目レイアウトである。制約条件が項目Ｐ１以降にセットされる。
【００４６】
【図９】縦４列横４列のマス目に、要素７−５−５を配置した場合における、「重なり要素関係分類」別の組み合わせレコード件数の一覧表である。組み合わせ欄のＰ／Ｑ／Ｒはそれぞれ第１グループ、第２グループ、第３グループを意味し、数字はその中での要素の位置を表す。合計数７２３２０件は、組み合わせパターン（パターン分類番号：４４７５５、図４参照）のレコード数に一致する。
【００４７】
【図１０】要素５−５−４−３の場合のマス目への配置例を表した図である。２列１行目のマス目で「ホトトギス」の「ス」と「スズメ」の「ス」とが重なっている。
【００４８】
【図１１】要素７−６−５の場合のマス目への配置例を表した図である。１列２行目のマス目と２列４行目のマス目の２箇所で重なっている。ここでは要素を記号であらわしている。記号の１桁目はグループ順位（Ｐ以降の英字）、２桁目は要素順位を表す。
【００４９】
【図１２】ハードウェアの構成を表した図である。
【００５０】
【図１３】縦４列横４行のマス目（ａ）と、その変数と識別名の割り当て（ｂ）を表した図である。マス目に配置する要素を保存するレベル値変数ＬＶの第１添え字Ｌには重なり順位がセットされる（図１４参照）。
【００５１】
【図１４】二段階方式のメモリ領域を表した図である。この図は、マス目の列数が４、行数が４、グループ数の最大値は５、要素数の最大値は１５の場合の変数配置を示している。
【００５２】
【図１５】二段階方式の配置組み合わせ出力部画面を表した図である。
【００５３】
【図１６】二段階方式の唯一解出力部画面を表した図である。
【００５４】
【図１７】配置組み合わせ出力部メイン処理のフローチャートである。
【００５５】
【図１８】要素配置処理のフローチャートである。サブルーチン「要素配置処理」は再帰関数になっている。すなわちその処理内部で自分自身を呼んでいる。
【００５６】
【図１９】マス目レベル値設定処理のフローチャートである。
【００５７】
【図２０】次要素処理のフローチャートである。
【００５８】
【図２１】次要素配置処理のフローチャートである。
【００５９】
【図２２】次要素チェック処理のフローチャートである。
【００６０】
【図２３】重なり配置可能チェック処理のフローチャートである。
【００６１】
【図２４】マス目レベル値クリア処理のフローチャートである。
【００６２】
【図２５】次グループ処理のフローチャートである。
【００６３】
【図２６】唯一解出力部メイン処理のフローチャートである。
【００６４】
【図２７】縦４列横４列のマス目に、要素７−６−５を配置する場合における、重なり要素関係分類別の配置組み合わせレコード件数の一覧表である。３，３８８個に分類され、合計数は４７１，０４０になる。図４参照。
【００６５】
【図２８】一段階方式唯一解算出画面その１である。この画面では、制約条件として各グループ各要素のマス目位置を指定することができる。
【００６６】
【図２９】一段階方式唯一解算出画面その２である。この画面では、制約条件として各マス目の要素を指定することができる。図２８と図２９のパターン分類は６５７７７５５、重なり要素関係分類はＲ３Ｔ２になる。
【００６７】
【図３０】一段階方式のメモリ領域を表した図である。この図は、マス目の最大列数が９、最大行数が９、グループ数の最大値は９、要素数の最大値は１５の場合の変数配置を示している。
【００６８】
【図３１】一段階方式のメインフローチャートである。
【００６９】
【図３２】初期配置処理（一段階方式）のフローチャートである。
【００７０】
【図３３】要素配置処理（一段階方式）のフローチャートである。サブルーチン「要素配置処理」は再帰関数である。
【００７１】
【図３４】次要素処理（一段階方式）のフローチャートである。
【００７２】
【図３５】次グループ処理（一段階方式）のフローチャートである。
【００７３】
【図３６】一段階方式の唯一解レコードの項目レイアウトである。Ｐ１以降Ｔ５までは要素数７−７−７−５−５の場合の各要素のマス目位置を保持する項目である。初期配置するマス目位置を表す記号の末尾に＊（アスタリスク）を付加することとする。
【００７４】
【図３７】要素配置場所を表した図である。    （ａ）  配置場所数が９の場合の要素配置場所を表した図である。要素配置場所間の隣接が有る場合は線で結合している。    （ｂ）  縦３列横３行のマス目の隣接有無を線で表したものである。    （ｃ）  要素を都道府県とした実施例である。この場合の隣接有無は都道府県境の有無に一致する。    （ｄ）  縦４列横４行のマス目の３か所は要素を配置できないとした例。    （ｅ）  （ｄ）のマス目において、要素が１から５の数字である３つのグループを配置するパズルの例。制約条件としての初期配置が記されている。○で囲まれた数字は重なりを意味する。
【００７５】
【図３８】隣接定義図を表した図で、「＋」は双方向に隣接有、「−」は双方向に隣接無を表している。以下の（ａ）、（ｂ）、（ｃ）の隣接はいずれも双方向である。    （ａ）  図３７（ａ）の隣接定義図である。    （ｂ）  図３７（ｂ）の隣接定義図である。    （ｃ）  図３７（ｄ）の隣接定義図である。
【００７６】
【図３９】隣接定義方式の唯一解判定画面を表した図である。ここでは、配置場所数９、グループ数３、要素４−３−３、制約条件として配置場所Ｘ５に要素Ｑ３とＲ２を初期配置している。      ・配置場所間隣接定義は各配置場所（Ｘ１〜Ｘ９）間が隣接有なら「＋」、隣接無なら「−」を設定するマトリックスである。      ・初期配置設定は、要素（第１グループ：Ｐｎ、第２グループ：Ｑｎ、第３グループ：Ｒｎ、ｎは要素番号）とその配置場所（Ｘ１〜Ｘ９）を指定する。ここでは、要素Ｑ３を配置場所Ｘ５、要素Ｒ２を配置場所Ｘ５と指定しているので、配置場所Ｘ５で２つの要素が重なっていることを意味する。      ・デフォルトの隣接定義は双方向とする。従って、Ｘｎ→Ｘｍ（ｎ＜ｍ）を設定すると自動的にＸｎ→Ｘｍ（ｎ＞ｍ）も設定される。単方向に切り替えると、Ｘｎ→Ｘｍ（ｎ＞ｍ）も独立に設定可能になる。      ・要素間隣接定義を制約条件に加える場合は、画面に「要素間隣接定義」という表示にボタンを追加し、押下されたら要素間隣接定義作成画面（図５０）を呼び出すようにする。
【００７７】
【図４０】隣接定義方式のメモリ領域を表した図である。この図は、配置場所数が９、グループ数の最大値が５、要素数の最大値が７、重なり要素数の最大値が５の場合の変数配置を示している。ただし、ここでは１か所の要素配置場所には最大２つまで要素を重ねることが可能としている。
【００７８】
【図４１】隣接定義方式の唯一解レコードの項目レイアウトである。Ｐ１以降Ｒ３までは要素数４−３−３の場合の各要素の配置場所を保持する項目である。初期配置する配置場所の末尾に＊（アスタリスク）を付加することとする。
【００７９】
【図４２】隣接定義方式の唯一解判定処理メイン処理のフローチャートである。
【００８０】
【図４３】隣接定義方式の要素隣接配置処理のフローチャートである。サブルーチン「要素隣接配置処理」は再帰関数である。
【００８１】
【図４４】隣接定義方式のレベル値設定処理のフローチャートである。
【００８２】
【図４５】隣接定義方式の次要素処理のフローチャートである。
【００８３】
【図４６】隣接定義方式の次要素配置処理のフローチャートである。
【００８４】
【図４７】隣接定義方式の配置可能チェック処理のフローチャートである。
【００８５】
【図４８】隣接定義方式のレベル値クリア処理のフローチャートである。
【００８６】
【図４９】隣接定義方式の次グループ処理のフローチャートである。
【００８７】
【図５０】要素間隣接定義作成画面である。
【００８８】
【図５１】要素間隣接定義方式の要素隣接配置処理フローチャートである。図４３のステップＳ２２７以降の置き換え部分。
【発明を実施するための形態】
【００８９】
以下にマス目を使った実施例として、五・七・五の俳句を題材とした実施例１と、隣接定義がされている要素配置場所が配された平面を使った実施例として、都道府県の観光地の旅程を題材とした実施例２を説明する。なお、本発明の理解を助けるため具体的な表現を使用するが、本発明を限定するものではない。
【００９０】
実施例１については、五・七・五の俳句の３つの句の、合わせて１７個のモーラを縦４列横４行のマス目に、１つの句に属するモーラはその並び順に上下又は左右に連続して配置し、異なる句の同一モーラは重ねて配置することができ、モーラが置かれていないマス目がないように配置するとした場合のすべての配置組み合わせをプログラムにより算出し、その中から指定された制約条件のもとで唯一解を算出する実施例（二段階方式）を最初に説明し、その後に一段階方式を説明する。
【００９１】
俳句の場合、句の順番（上句＝上五、中句＝中七、下句＝下五）が意味を持つが、要素のマス目への配置パターンとしては、グループの要素数が降順になっているパターン分類番号が４４７５５（図４を参照。縦４列、横４行、第１グループ要素数７、第２グループ要素数５、第３グループ要素数５。組み合わせ数７２，３２０）の組み合わせと同一になるのでそれを使用する。この場合、「句」は「グループ」、「モーラ」は「要素」に相当し、要素数の降順に中句が第１グループ、上句が第２グループ、下句が第３グループに対応する。
【００９２】
組み合わせ出力部プログラムは図１２のハードウェア構成における外部メモリ０１に格納されていて、プログラム開始時にメモリ０２にロードして起動させる。起動すると、ディズプレイ０３に図１５のような配置組み合わせ出力部画面が表示される。
【００９３】
以下、図１７以降のフローチャートに沿って、ＣＰＵ０５で実行されるプログラムの流れを説明する。
ステップＳ１で、キーボード０４から入力された配置組み合わせ出力部画面（図１５）のマス目の列数２０、行数２１、グループ数２２、各グループの要素数２３をメモリ０２（図１４）の対応する変数領域（列数は１１、行数は１２、グループ数は１３、各グループの要素数は１４）にセットする。
【００９４】
また、入力されたグループの要素数の合計値からマス目の数を減算した値をメモリ０２の重なり要素数１５にセットするとともに、配置組み合わせ出力部画面（図１５）の重なり要素数２５にセットする。この実施例では、第１グループ要素数が７、第２グループ要素数が５、第３グループ要素数が５で、マス目列数が４、行数が４になるので、重なり要素数は１となる。
【００９５】
ステップＳ２で、ループ処理で使用するマス目のＸ座標（列番号）変数ｘとＹ座標（行番号）変数ｙを１に初期化し、ステップＳ７とステップＳ８で変数ｘと変数ｙに１を加算しながら、ステップＳ３とステップＳ４で変数ｘと変数ｙの上限チェックを行い、ステップＳ５とステップＳ６の処理を繰り返す。列数が４、行数が４の実施例では、ステップＳ５とステップＳ６の処理を１６回（変数ｘを１〜４、変数ｙを１〜４）繰り返すことになる。
【００９６】
ステップＳ５で、メモリ０２（図１４）のＬＶ配列変数１６（第１重なり要素レベル値から第５重なり要素レベル値まで）をゼロクリアする。なお、この値は各マス目に配置された要素のグループ番号を１００の位の１桁の数字で、要素番号を１０の位と１の位の２桁の数字で表す。例えば第３グループの第２要素ならば３０２となる。ＬＶ配列変数の第１添字には重なり順位（グループ数の最大値を５にしているので１〜５）、また、第２添字にはＸ座標、第３添字にはＹ座標をセットする。
【００９７】
ステップＳ６で、サブルーチン「要素配置処理」を呼ぶ。その際、第１引数（現グループ番号）に１、第２引数（現要素番号）に１、第３引数（現Ｘ座標）に変数ｘ、第４引数（現Ｙ座標）に変数ｙをセットする。
【００９８】
サブルーチン「要素配置処理」では、最初に、引数で渡される現在の要素をマス目に配置する処理（ステップＳ１２とステップＳ１３）を行った後に次の要素の処理へ進む。最後に、引数で渡された現在の要素のマス目とそれ下位のレベルの配置をクリアする（ステップＳ２１）。
以下、図１８のフローチャートに沿って説明する。
【００９９】
まず、ステップＳ１１で、引数をサブルーチン内部変数に取り込む。
【０１００】
ステップＳ１２で、各要素のマス目への配置位置を保存する変数１７（図１４．Ｘ座標はＷＸ、Ｙ座標はＷＹ、第１添字は現グループ番号、第２添字は現要素番号）に現Ｘ座標と現Ｙ座標をセットする。
【０１０１】
ステップＳ１３で、サブルーチン「マス目レベル値設定処理」を呼ぶ。その際、第１引数（グループ番号）に現グループ番号、第２引数（要素番号）に現要素番号、第３引数（Ｘ座標）に現Ｘ座標、第４引数（Ｙ座標）に現Ｙ座標をセットする。
【０１０２】
ステップＳ１４で、第２引数の現要素番号に１を加算して次要素番号を算出し次の要素の処理へ進む。次のステップＳ１５で、この次要素番号がその属するグループの最大要素番号を超えたかどうかを判定し、超えない場合、すなわち次要素番号が存在する場合はステップＳ１６、超える場合、すなわち次要素番号が存在しない場合はステップＳ１７を処理する。
【０１０３】
ステップＳ１６で、サブルーチン「次要素処理」を呼ぶ。その際、第１引数（グループ番号）に現グループ番号、第２引数（要素番号）にステップＳ１４で算出した次要素番号、第３引数（Ｘ座標）に現Ｘ座標、第４引数（Ｙ座標）に現Ｙ座標をセットする。その処理後ステップＳ２１へ行く。
【０１０４】
ステップＳ１７で、第１引数の現グループ番号に１を加算した値を次グループ番号とする。次のステップＳ１８で、この次グループ番号がメモリ０２（図１４）のグループ数１３を超えたかどうかを判定し、超えない場合、すなわち次グループ番号が存在する場合はステップＳ１９、超える場合、すなわち次グループ番号が存在しない場合はステップＳ２０の出力処理を実行し、その処理後ステップＳ２１へ行く。
【０１０５】
ステップＳ１９で、サブルーチン「次グループ処理」（図２５）を呼ぶ。その際、引数（グループ番号）に次グループ番号をセットする。
【０１０６】
ステップＳ２０で、メモリ０２（図１４）に保存されているデータを配置組み合わせ（各マス目の配置要素）レコードとして外部メモリ０１に出力する。出力項目は図６のとおり。
【０１０７】
・  ＰＩＤはレコード出力ごとに１からの連番を出力する。
【０１０８】
・  ＰＴＹＰＥ（パターン分類）は図３から図５に示されているように、マス目の列数と行数、各グループの要素数を連結した文字列を出力する。
【０１０９】
・  Ａ１からＤ４までの各マス目に置く要素を示す記号（１６項目）は、以下の（１）から（４）のように、メモリ０２（図１４）の各要素のマス目への配置位置１７のＷＸとＷＹの内容を順次調べて、該当するマス目の位置のグループ記号（第１グループはＰ、第２グループはＱ、第３グループはＲ、第４グループはＳ、第５グループはＴ）と要素番号（１〜１５）を連結した文字列を出力する。なおこの実施例ではＡ１からＤ４の１６項目だが、例えば、マス目が３列２行の場合はＡ１、Ａ２、Ｂ１、Ｂ２、Ｃ１、Ｃ２の６項目になる。
（１）  列数変数ｘを１からマス目の列数まで、行数変数ｙを１からマス目の行数まで順に設定したうえで以下の比較処理を行う。
（２）  第１グループの第１要素のＷＸ（１，１）とＷＹ（１，１）がｘとｙに一致すれば、Ｐ１を出力し、当比較処理を出る。これは、重なりがある場合は最初の重なり順序の要素を出力することを意味する。
（３）  次に、第１グループの第２要素のＷＸ（１，２）とＷＹ（１，２）がｘとｙに一致すれば、Ｐ２を出力し、当比較処理を出る。この処理を第１グループの要素数だけ繰り返す。
（４）  第２グループ以降についても、（２）、（３）と同様の処理を行う。
【０１１０】
・  ＤＵＰＰＯＳ１、ＤＵＰＵ１、ＤＵＰＤ１からＤＵＰＰＯＳ６、ＤＵＰＵ６、ＤＵＰＤ６までの６組の重なりデータは、以下の（１）から（９）のようにメモリ０２（図１４）のマス目重なり要素レベル値１６を順次読んで出力する。
（１）  列数変数ｘを１からマス目の列数まで、行数変数ｙを１からマス目の行数まで順に設定したうえで以下の処理を行う。なおＮは初期値を１とし、出力するごとに１を加算する。
（２）  ＬＶ（５，ｘ，ｙ）が０以外ならば、ＬＶ（１，ｘ，ｙ）とＬＶ（２，ｘ，ｙ）から１組、ＬＶ（１，ｘ，ｙ）とＬＶ（３，ｘ，ｙ）から１組、ＬＶ（１，ｘ，ｙ）とＬＶ（４，ｘ，ｙ）から１組、ＬＶ（１，ｘ，ｙ）とＬＶ（５，ｘ，ｙ）から１組の合計４組の重なりデータを作成する。これは１つのマス目に５つの要素が重なっている例である。
（３）  ＬＶ（４，ｘ，ｙ）が０以外ならば、ＬＶ（１，ｘ，ｙ）とＬＶ（２，ｘ，ｙ）から１組、ＬＶ（１，ｘ，ｙ）とＬＶ（３，ｘ，ｙ）から１組、ＬＶ（１，ｘ，ｙ）とＬＶ（４，ｘ，ｙ）から１組の合計３組の重なりデータを作成する。これは１つのマス目に４つの要素が重なっている例である。
（４）  ＬＶ（３，ｘ，ｙ）が０以外ならば、ＬＶ（１，ｘ，ｙ）とＬＶ（２，ｘ，ｙ）から１組、ＬＶ（１，ｘ，ｙ）とＬＶ（３，ｘ，ｙ）から１組の合計２組の重なりデータを作成する。これは１つのマス目に３つの要素が重なっている例である。
（５）  ＬＶ（２，ｘ，ｙ）が０以外ならば、ＬＶ（１，ｘ，ｙ）とＬＶ（２，ｘ，ｙ）から１組の重なりデータを作成する。これは１つのマス目に２つの要素が重なっている例である。
（６）  １組の重なりデータは、重なり順序の小さいＬＶ（Ｌ，ｘ，ｙ）と重なり順序の大きいＬＶ（Ｈ，ｘ，ｙ）から以下のように作成する。
（７）  まず、ｘ座標とｙ座標より、ｘの１〜４を列を表す文字ＡＢＣＤに置き換え、ｙと連結した２文字をＤＵＰＰＯＳＮにセットする。
（８）  次に、ＬＶ（Ｌ，ｘ，ｙ）の１００の位の１〜５をグループ番号を表す文字ＰＱＲＳＴに置き換え、１０の位と１の位の要素番号を表す文字と連結した３文字をＤＵＰＵＮにセットする。
（９）  次に、ＬＶ（Ｈ，ｘ，ｙ）の１００の位の１〜５をグループ番号を表す文字ＰＱＲＳＴに置き換え、１０の位と１の位の要素番号を表す文字と連結した３文字をＤＵＰＤＮにセットする。
【０１１１】
ステップＳ２０では同時に、メモリ０２に保存されているデータを配置組み合わせ（各要素のマス目位置）レコードとしても外部メモリ０１に出力する。出力項目は図７のとおり。
【０１１２】
・  ＰＩＤはレコード出力ごとに１からの連番を出力する。これは、上記の各マス目の配置要素レコードのＰＩＤと一致する。
【０１１３】
・  ＰＴＹＰＥ（パターン分類）は上記の各マス目の配置要素レコードのＰＴＹＰＥと一致する。
【０１１４】
・  第１グループの各要素のマス目の位置（Ｐ１〜Ｐ７）の７項目は、メモリ０２（図１４）の各要素のマス目への配置位置１７のＷＸ（１，１）からＷＸ（１，７）とＷＹ（１，１）からＷＹ（１，７）の内容をマス目位置記号（Ａ１〜Ｄ４）に変換して順次出力する。
【０１１５】
・  第２グループの各要素のマス目の位置（Ｑ１〜Ｑ７）の５項目は、メモリ０２（図１４）の各要素のマス目への配置位置１７のＷＸ（２，１）からＷＸ（２，５）とＷＹ（２，１）からＷＹ（２，５）の内容をマス目位置記号（Ａ１〜Ｄ４）に変換して順次出力する。
【０１１６】
・  第３グループの各要素のマス目の位置（Ｒ１〜Ｒ７）の５項目は、メモリ０２（図１４）の各要素のマス目への配置位置１７のＷＸ（３，１）からＷＸ（３，５）とＷＹ（３，１）からＷＹ（３，５）の内容をマス目位置記号（Ａ１〜Ｄ４）に変換して順次出力する。
【０１１７】
・  ＤＵＰＰＯＳ１、ＤＵＰＵ１、ＤＵＰＤ１はメモリ０２（図１４）の重なり要素レベル値１６を順次読んで出力する。これは、上記の各マス目の配置要素レコードのＤＵＰＰＯＳ１、ＤＵＰＵ１、ＤＵＰＤ１と一致する。
【０１１８】
ステップＳ２１で、現グループ番号に１００を掛けた値に現要素番号を加えた値を引数（レベル値）にセットし、サブルーチン「マス目レベル値クリア処理」を呼ぶ。この処理までに引数で渡される現在の要素に対する処理は完了しているので、この処理により現在の要素のマス目とその下位レベルの要素への配置をすべてクリアする。
【０１１９】
当サブルーチン処理を終了し、元の処理に戻る。
【０１２０】
サブルーチン「マス目レベル値設定処理」では、各マス目にどの要素が配置されたかを記憶する。グループ数が５の場合、１つのマス目に最大５つまで重ねて配置されるので、メモリ０２（図１４）のＬＶ配列変数では、第１添字で重なり順位を指定する。
以下、図１９のフローチャートに沿って説明する。
【０１２１】
まず、ステップＳ３１で、引数をサブルーチン内部変数に取り込む。
【０１２２】
ステップＳ３２で、マス目に１つ目の要素がすでに配置されているかをチェックし、配置されていない場合、すなわち、ＬＶ（１、現Ｘ座標、現Ｙ座標）が０の場合は、ステップＳ３３で、現グループ番号に１００を掛けた値に現要素番号を加えた値をＬＶ（１、現Ｘ座標、現Ｙ座標）にセットし、当サブルーチン処理を終了し、元の処理に戻る。
【０１２３】
すでにマス目の１つ目の要素が配置されている場合は、ステップＳ３４で、マス目に２つ目の要素がすでに配置されているかをチェックし、配置されていない場合、すなわち、ＬＶ（２、現Ｘ座標、現Ｙ座標）が０の場合は、ステップＳ３５で、現グループ番号に１００を掛けた値に現要素番号を加えた値をＬＶ（２、現Ｘ座標、現Ｙ座標）にセットし、当サブルーチン処理を終了し、元の処理に戻る。
【０１２４】
すでにマス目の２つ目の要素も配置されている場合は、ステップＳ３６で、マス目に３つ目の要素がすでに配置されているかをチェックし、配置されていない場合、すなわち、ＬＶ（３、現Ｘ座標、現Ｙ座標）が０の場合は、ステップＳ３７で、現グループ番号に１００を掛けた値に現要素番号を加えた値をＬＶ（３、現Ｘ座標、現Ｙ座標）にセットし、当サブルーチン処理を終了し、元の処理に戻る。
【０１２５】
すでにマス目の３つ目の要素も配置されている場合は、ステップＳ３８で、マス目に４つ目の要素がすでに配置されているかをチェックし、配置されていない場合、すなわち、ＬＶ（４、現Ｘ座標、現Ｙ座標）が０の場合は、ステップＳ３９で、現グループ番号に１００を掛けた値に現要素番号を加えた値をＬＶ（４、現Ｘ座標、現Ｙ座標）にセットし、当サブルーチン処理を終了し、元の処理に戻る。
【０１２６】
すでにマス目の４つ目の要素も配置されている場合は、ステップＳ４０で、マス目に５つ目の要素がすでに配置されているかをチェックし、配置されていない場合、すなわち、ＬＶ（５、現Ｘ座標、現Ｙ座標）が０の場合は、ステップＳ４１で、現グループ番号に１００を掛けた値に現要素番号を加えた値をＬＶ（５、現Ｘ座標、現Ｙ座標）にセットし、当サブルーチン処理を終了し、元の処理に戻る。
【０１２７】
すでにマス目の５つ目の要素も配置されている場合は、エラー処理（エラーメッセージ出力等）を行った上で処理を中止する。
【０１２８】
サブルーチン「次要素処理」では、現在の要素の位置を基点にして、上、下、右、左隣のマス目を次の要素の位置として配置処理を行う。すなわち、第２要素以降の従属要素（直前のマス目の上下左右のマス目にしか置けない要素）の配置処理である。
以下、図２０のフローチャートに沿って説明する。
【０１２９】
まず、ステップＳ５１で、引数をサブルーチン内部変数に取り込む。
【０１３０】
ステップＳ５２で、サブルーチン「次要素配置処理」を呼ぶ。その際、第１引数（方向）に「上」、第２引数（グループ番号）に現グループ番号、第３引数（要素番号）に次要素番号、第４引数（Ｘ座標）に現Ｘ座標、第５引数（Ｙ座標）に現Ｙ座標をセットする。
【０１３１】
ステップＳ５３で、サブルーチン「次要素配置処理」を呼ぶ。その際、第１引数（方向）に「下」、第２引数（グループ番号）に現グループ番号、第３引数（要素番号）に次要素番号、第４引数（Ｘ座標）に現Ｘ座標、第５引数（Ｙ座標）に現Ｙ座標をセットする。
【０１３２】
ステップＳ５４で、サブルーチン「次要素配置処理」を呼ぶ。その際、第１引数（方向）に「右」、第２引数（グループ番号）に現グループ番号、第３引数（要素番号）に次要素番号、第４引数（Ｘ座標）に現Ｘ座標、第５引数（Ｙ座標）に現Ｙ座標をセットする。
【０１３３】
ステップＳ５５で、サブルーチン「次要素配置処理」を呼ぶ。その際、第１引数（方向）に「左」、第２引数（グループ番号）に現グループ番号、第３引数（要素番号）に次要素番号、第４引数（Ｘ座標）に現Ｘ座標、第５引数（Ｙ座標）に現Ｙ座標をセットする。
【０１３４】
当サブルーチン処理を終了し、元の処理に戻る。
【０１３５】
サブルーチン「次要素配置処理」では、引数で指定された方向のマス目に配置可能かをチェックし、配置可能ならサブルーチン「要素配置処理」を呼ぶ。なお、このサブルーチンは配置組み合わせ出力部メイン処理のステップＳ６で呼ばれたサブルーチンと同一で再帰関数となっている。
以下、図２１のフローチャートに沿って説明する。
【０１３６】
まず、ステップＳ６１で、引数をサブルーチン内部変数に取り込む。
【０１３７】
ステップＳ６２で、引数の方向を判定し、「上」ならばステップＳ６３で現Ｙ座標に１を減算した値を次Ｙ座標に、現Ｘ座標を次Ｘ座標にセットし、ステップＳ６９へ行く。
【０１３８】
ステップＳ６４で、引数の方向を判定し、「下」ならばステップＳ６５で現Ｙ座標に１を加算した値を次Ｙ座標に、現Ｘ座標を次Ｘ座標にセットし、ステップＳ６９へ行く。
【０１３９】
ステップＳ６６で、引数の方向を判定し、「右」ならばステップＳ６７で現Ｘ座標に１を加算した値を次Ｘ座標に、現Ｙ座標を次Ｙ座標にセットし、ステップＳ６９へ行く。
【０１４０】
引数の方向が「上」、「下」、「右」のいずれでもない場合はステップＳ６８で現Ｘ座標に１を減算した値を次Ｘ座標に、現Ｙ座標を次Ｙ座標にセットし、ステップＳ６９へ行く。
【０１４１】
ステップＳ６９で、サブルーチン「次要素チェック処理」を呼ぶ。その際、第１引数（グループ番号）に現グループ番号、第２引数（要素番号）に現要素番号、第３引数（Ｘ座標）に次Ｘ座標、第４引数（Ｙ座標）に次Ｙ座標をセットする。
【０１４２】
ステップＳ７０で，ステップＳ６９で、サブルーチン「次要素チェック処理」の戻り値（チェックＯＫ又はチェックＮＧ）を判定し、チェックＯＫなら、ステップＳ７１でサブルーチン「要素配置処理」を呼ぶ。
【０１４３】
当サブルーチン処理を終了し、元の処理に戻る。
【０１４４】
サブルーチン「次要素チェック処理」では、引数で指定された座標のマス目に配置可能かをチェックし、配置可能なら戻り値をチェックＯＫとし、配置不可なら戻り値をチェックＮＧとする。
以下、図２２のフローチャートに沿って説明する。
【０１４５】
まず、ステップＳ８１で、引数をサブルーチン内部変数に取り込む。
【０１４６】
ステップＳ８２で、次Ｘ座標が１からマス目の列数までの範囲内にあるかどうかをチェックし、範囲外であれば、戻り値にチェックＮＧをセットして、当サブルーチン処理を終了し、元の処理に戻る。
【０１４７】
ステップＳ８３で、次Ｙ座標が１からマス目の行数までの範囲内にあるかどうかをチェックし、範囲外であれば、戻り値にチェックＮＧをセットして、当サブルーチン処理を終了し、元の処理に戻る。
【０１４８】
ステップＳ８４で、次Ｘ座標と次Ｙ座標が指し示すマス目に、引数の現グループ番号と同じグループの要素がすでに置かれているかどうかを、メモリ０２（図１４）の配列変数ＬＶ（１，次Ｘ座標，次Ｙ座標）、ＬＶ（２，次Ｘ座標，次Ｙ座標）、ＬＶ（３，次Ｘ座標，次Ｙ座標）、ＬＶ（４，次Ｘ座標，次Ｙ座標）、ＬＶ（５，次Ｘ座標，次Ｙ座標）のレベル値の１００の位を現グループ番号と比較し、同じグループの要素がすでに置かれている場合は戻り値にチェックＮＧをセットして、当サブルーチン処理を終了し、元の処理に戻る。
【０１４９】
ステップＳ８６で、サブルーチン「重なり配置可能チェック」を呼ぶ。その際、第１引数（Ｘ座標）に次Ｘ座標、第２引数（Ｙ座標）に次Ｙ座標をセットする。その結果により、重なり可能であれば戻り値にチェックＯＫを、重なり不可であれば戻り値にチェックＮＧをセットして、当サブルーチン処理を終了し、元の処理に戻る。
【０１５０】
サブルーチン「重なり配置可能チェック」では、引数で指定された座標のマス目に重なり配置が可能かどうかをチェックし、配置可能なら戻り値をチェックＯＫとし、配置不可なら戻り値をチェックＮＧとする。
以下、図２３のフローチャートに沿って説明する。
【０１５１】
まず、ステップＳ９１で、引数をサブルーチン内部変数に取り込む。
【０１５２】
ステップＳ９２で、引数で指定されたマス目１箇所だけで、重なり数を超えてしまうかどうかをチェックする。
すなわち、重なり数がＮ（Ｎ＝０〜４）の場合、すでにＬＶ（Ｎ＋１，Ｘ座標，Ｙ座標）が０以外であれば、チェックＮＧとして当サブルーチン処理を終了し、元の処理に戻る。
【０１５３】
ステップＳ９３では、重なり数が１以上の場合に以下のチェックを行う。最初に引数で指定されたマス目について現時点の重なり数に１をプラスした値を算出する。次に、引数で指定されたマス目を除くすべてのマス目において現時点の重なり数を合計した値を算出する。そして、両者を合わせた値が重なり数を超えるかどうかをチェックする。超えた場合はチェックＮＧ、超えない場合はチェックＯＫとして当サブルーチン処理を終了し、元の処理に戻る。
この算出では、座標（ｘ，ｙ）のマス目の重なり数は、ＬＶ（５，ｘ，ｙ）が０以外なら４、ＬＶ（４，ｘ，ｙ）が０以外なら３、ＬＶ（３，ｘ，ｙ）が０以外なら２、ＬＶ（２，ｘ，ｙ）が０以外なら１とカウントする。
【０１５４】
サブルーチン「マス目レベル値クリア処理」は、メモリ０２（図１４）の第１重なり要素レベル値から第５重なり要素レベル値が引数で指定されたレベル値と同じ又は大きい値の場合にゼロクリアする。これは指定した要素とその下位レベルの要素のマス目への配置をクリアする処理である。
以下、図２４のフローチャートに沿って説明する。
【０１５５】
ステップＳ１０１で、ループ処理で使用するマス目のＸ座標（列番号）変数ｘとＹ座標（行番号）変数ｙを１に初期化し、ステップＳ１０９とステップＳ１１０で変数ｘと変数ｙに１を加算しながら、ステップＳ１０２とステップＳ１０３で変数ｘと変数ｙの上限チェックを行い、ステップＳ１０４からステップＳ１０８の処理を繰り返す。
【０１５６】
ステップＳ１０４で、ＬＶ（１，ｘ，ｙ）が引数のレベル値以上ならゼロクリアする。
【０１５７】
ステップＳ１０５で、ＬＶ（２，ｘ，ｙ）が引数のレベル値以上ならゼロクリアする。
【０１５８】
ステップＳ１０６で、ＬＶ（３，ｘ，ｙ）が引数のレベル値以上ならゼロクリアする。
【０１５９】
ステップＳ１０７で、ＬＶ（４，ｘ，ｙ）が引数のレベル値以上ならゼロクリアする。
【０１６０】
ステップＳ１０８で、ＬＶ（５，ｘ，ｙ）が引数のレベル値以上ならゼロクリアする。
【０１６１】
当サブルーチン処理を終了し、元の処理に戻る。
【０１６２】
処理が終了すると、算出されたすべての組み合わせパターンの各マス目の配置要素レコード（レイアウトは図６を参照）と各要素のマス目位置レコード（レイアウトは図７を参照）が外部メモリに出力される。
【０１６３】
サブルーチン「次グループ処理」は、第２グループ以降の第１要素（独立要素）を配置する処理である。
以下、図２５のフローチャートに沿って説明する。
【０１６４】
ステップＳ１１１で、引数の次グループ番号を内部変数に取り込む。
【０１６５】
ステップＳ１１２で、ループ処理で使用するマス目のＸ座標（列番号）変数ｘとＹ座標（行番号）変数ｙを１に初期化し、ステップＳ１１８とステップＳ１１９で変数ｘと変数ｙに１を加算しながら、ステップＳ１１３とステップＳ１１４で変数ｘと変数ｙの上限チェックを行い、ステップＳ１１５からステップＳ１１７の処理を繰り返す。
【０１６６】
ステップＳ１１５で、サブルーチン「重なり配置可能チェック」を呼ぶ。その際、第１引数（Ｘ座標）にＸ座標（列番号）変数ｘ、第２引数（Ｙ座標）にＹ座標（行番号）変数ｙをセットする。その結果により、配置可能であればステップＳ１１７へ、配置不可であればステップＳ１１８へ行く。
【０１６７】
サブルーチン「重なり配置可能チェック」では、引数で指定された座標のマス目に重なり配置が可能かどうかをチェックし、配置可能なら戻り値をチェックＯＫとし、配置不可なら戻り値をチェックＮＧとする。
【０１６８】
ステップＳ１１７で、サブルーチン「要素配置処理」を呼ぶ。その際、第１引数（現グループ番号）に次グループ番号、第２引数（現要素番号）に１、第３引数（現Ｘ座標）に変数ｘ、第４引数（現Ｙ座標）に変数ｙをセットする。
【０１６９】
次に、唯一解出力部プログラムをメモリ０２にロードして起動させる。起動すると、ディズプレイ０３に唯一解出力部画面（図１６）が表示される。
【０１７０】
キーボード０４から画面に表示されたパターン分類３０と重なり要素関係分類３１を選択し、唯一解算出の各種制約条件の優先順位３２（１〜９、１が最高優先、９が最低優先）を入力し、処理実行ボタン３４を押下してプログラムを起動する。処理が終了すると、算出された唯一解のレコード（レイアウトは図８を参照）が外部メモリ０１に出力される。
【０１７１】
「各種制約条件の優先順位」は以下の９種類から指定できる。
各グループ第３要素以降はこの実施例では対象外としている。
・  各グループ第１要素配置場所指定
・  各グループ第２要素配置場所指定
・  各グループ最終要素配置場所指定
・  第１重なり配置場所指定
・  第２重なり配置場所指定
・  第３重なり配置場所指定
・  第４重なり配置場所指定
・  第５重なり配置場所指定
・  第６重なり配置場所指定
【０１７２】
ここでは、制約条件の優先順位は次のとおりとする。
・  各グループ第１要素位置指定・・優先順位第１位
・  第１重なり配置場所指定    ・・優先順位第２位
・  各グループ第２要素位置指定・・優先順位第３位
・  各グループ最終要素位置指定・・優先順位第４位
【０１７３】
すなわち、まず、各グループ第１要素位置指定で唯一解の有無を調べ、唯一解がなければ、各グループ第１要素位置指定に加えて、第１重なり配置場所指定で唯一解の有無を調べ、唯一解がなければ、更に各グループ第２要素位置指定を制約条件に加えて唯一解の有無を調べる。以上のように順に制約条件を追加しながら唯一解が見つかるまで繰り返す。
【０１７４】
なお、マス目の列数と行数、各グループの要素数、唯一解算出条件の各種制約条件の優先順位を固定でセットするか、テキストファイルの読み込みでセットすることも可能だが、ここでは画面から変更可能とした実施例で説明する。
【０１７５】
以下、図２６のフローチャートに沿って、ＣＰＵ０５で実行されるプログラムの流れを説明する。
ステップＳ１２０で、キーボード０４から入力されたパターン分類３０と重なり要素関係分類３１、また唯一解算出条件の各種制約条件の処理優先順位を取得する。
【０１７６】
ステップＳ１２１で、制約条件の優先順位に従って、各種制約条件の処理に未処理があるかどうかを判定し、未処理が無い場合は処理を終了する。
【０１７７】
ステップＳ１２２で、組み合わせパターンのレコードからステップＳ１２０で読み込んだパターン分類と要素関係分類に一致するレコードのみを抽出する命令文を組み立てる。
ここでは、重なり数が１の実施例で説明する。
【０１７８】
例えば、パターン分類（ＰＴＹＰＥ）として４４７５５、重なり要素関係分類（ＤＵＰＴＹＰＥ）としてＰ４Ｒ５（第１グループの第４要素と第３グループの第５要素が重なる関係）が選択された場合は、配置組み合わせ（各要素のマス目位置）レコード（図７）のＰＴＹＰＥ（パターン分類番号）が４４７５５、ＤＵＰＵ１（重なり要素の上位の要素を示す記号）がＰ４、ＤＵＰＤ１（重なり要素の下位の要素を示す記号）がＲ５のデータを抽出する。
【０１７９】
ステップＳ１２３で、ステップＳ１２２で作成した抽出レコード（上記例では９９２件）に対し、各種制約条件の第１優先順位である各グループ第１要素位置の３つの要素（Ｐ１、Ｑ１、Ｒ１）を集計キーとして集計レコードを作成して、集計キーごとに抽出レコードを何件ずつ集計したのかを調べる。例えば、Ｐ１（第１グループの第１要素）をＡ１のマス目、Ｑ１（第２グループの第１要素）をＡ２のマス目、Ｒ１（第３グループの第１要素）をＡ３のマス目に配置する場合の集計件数は２件になるので唯一解にはならない。
【０１８０】
しかし、Ｐ１をＡ４のマス目、Ｑ１をＣ３のマス目、Ｒ１をＢ２のマス目に配置する場合の集計件数は１件となるので唯一解になる。
【０１８１】
また、Ｐ１をＣ３のマス目、Ｑ１をＡ４のマス目、Ｒ１をＢ３のマス目に配置する場合の集計件数も１件となるので唯一解になる。図１はこの唯一解の応用例である。
【０１８２】
以上のようにすべての集計キーごとに唯一解になるかどうかを調べる。この例のように、各グループ第１要素位置指定のみで唯一解が見つかった場合は、その内容を出力して処理を終了することになる。すなわち優先順位第２位以下の条件追加は必要ないことになる。
【０１８３】
唯一解が存在しない場合は更に次の優先順位の「第１重なり配置場所指定」を条件に追加し、ステップＳ１２２で作成した抽出レコードに対し、Ｐ１、Ｑ１、Ｒ１、ＤＵＰＰＯＳ１（第１重なり配置場所）を集計キーとして集計レコードを作成して、集計キーごとの集計レコードの集計件数が１（唯一解）になるかどうかをチェックする。
【０１８４】
唯一解が存在しない場合は更に次の優先順位である「各グループ第２要素位置指定」を条件に追加し、ステップＳ１２２で作成した抽出レコードに対し、Ｐ１、Ｐ２、Ｑ１、Ｑ２、Ｒ１、Ｒ２，ＤＵＰＰＯＳ１を集計キーとして集計レコードを作成して、集計キーごとの集計レコードの集計件数が１（唯一解）になるかどうかをチェックする。
【０１８５】
ステップＳ１２４で、唯一解が存在した場合は次の出力処置を実行し、存在しない場合は次の優先順位の条件による処理へ行く。
【０１８６】
ステップＳ１２５で、唯一解のレコード（レイアウトは図８を参照）を外部メモリ０１に出力し処理を終了する。
・  ＩＤはレコード出力ごとに１からの連番を出力する。
・  ＰＩＤは配置組み合わせレコードのレコード識別番号をそのまま出力する。
・  ＰＴＹＰＥは配置組み合わせレコードのパターン分類番号をそのまま出力する。
・  ＤＵＰＴＹＰＥはステップＳ１で入力された重なり要素関係分類。
【０１８７】
次に、一段階方式について説明する。
以下、図３１以降のフローチャートに沿ってプログラムの流れを説明する。
【０１８８】
ステップＳ１３０で、キーボード０４から入力された一段階方式唯一解算出画面（その１は図２８、その２は図２９。両者は切り替えボタン４９で切り替え可能）のマス目の列数４０、行数４１、グループ数４２、各グループの要素数４３、制約条件（グループ要素単位）４７又は制約条件（マス目単位）４８をメモリ０２（図３０）の対応する変数領域（列数は５０、行数は５１、グループ数は５２、重なり要素数５３、各グループの要素数は５４、制約条件はステップＳ１３１に詳述）にセットする。
【０１８９】
ステップＳ１３１で、上記ステップで読み込んだ制約条件としての初期配置を配列変数ＬＶＩ（Ｌ，Ｘ，Ｙ）に保存する。Ｌは重なり順位、Ｘは重なり位置の列座標、Ｙは重なり位置の行座標で、グループ番号に１００を掛けた値に要素番号を加算した値をセットし、初期値（未設定）は０とする。例えばＣ列２行（列座標：３、行座標：２）のマス目に第３グループ第３要素と第５グループ第２要素が初期設定される場合は、ＬＶＩ（１，３，２）に３０３、ＬＶＩ（２，３，２）に５０２をセットする。
【０１９０】
上記のように１つのマス目に２つの要素が重なる場合は、配列変数ＬＶＩ（Ｌ，Ｘ，Ｙ）のＬは、グループ番号の昇順に、最初の要素ではＬ＝１、次の要素ではＬ＝２となる。
【０１９１】
また、制約条件としての初期配置を配列変数ＷＸＩ（Ｇ，Ｅ）、ＷＹＩ（Ｇ，Ｅ）に保存する。Ｇはグループ番号、Ｅは要素番号で、ＷＸＩには列座標、ＷＹＩには行座標をセットし、初期値（未設定）は０とする。例えばＣ列２行（列座標：３、行座標：２）のマス目に第３グループ第３要素と第５グループ第２要素が初期設定される場合は、ＷＸＩ（３、３）に３、ＷＹＩ（３、３）に２をセットするとともに、ＷＸＩ（５、２）に３、ＷＹＩ（５、２）に２をセットする。
【０１９２】
一段階方式唯一解算出画面その１（図２８）とその２（図２９）の違いは、前者は初期配置するグループ、要素のマス目位置を指定するのに対し、後者は初期配置するマス目のグループ、要素を指定する点で、両者は裏表の関係になる。なお、１つのマス目に２つの要素を初期配置する場合、後者においてはグループ番号の小さい要素を上段に、大きい要素を下段に設定することとする。この実施例の画面では初期配置の段階で１つのマス目に３つ以上の要素を重ねる場合には対応していない。
【０１９３】
ステップＳ１３２で、ループ処理で使用するマス目のＸ座標（列番号）変数ｘとＹ座標（行番号）変数ｙを１に初期化し、ステップＳ１３９とステップＳ１４１で変数ｘと変数ｙに１を加算しながら、ステップＳ１３３とステップＳ１３４で変数ｘと変数ｙの上限チェックを行う。その間、ステップＳ１３５からステップＳ１３８の処理を繰り返す。
【０１９４】
ただし、ステップＳ１４０で、第１グループ第１要素の初期配置が設定されている場合はループ処理を行わずに処理を終了する。
【０１９５】
ステップＳ１３１で、初期配置処理サブルーチン（図３２）を呼ぶ。このサブルーチンでは、一段階方式唯一解算出画面その１（図２８）とその２（図２９）の制約条件からメモリ０２（図３０）の初期配置重なり要素レベル値５６と各要素のマス目への初期配置位置５８を設定する。
【０１９６】
ステップＳ１３５で、初期配置重なり要素レベル値５６の全配列要素を重なり要素レベル値５５にコピーする。また、各要素のマス目への初期配置位置５８の全配列要素を各要素のマス目への配置位置５７にコピーする。
【０１９７】
ステップＳ１３６で、第１グループ第１要素の初期配置設定値ＷＸＩ（１，１）が０、すなわち未設定ならばステップＳ１３８へ行き、通常のループ処理を行う。設定済ならばステップＳ１３７を実行し、第１グループ第１要素の初期配置設定値ＷＸＩ（１，１）をｘに、ＷＹＩ（１，１）をｙにセットする。また、この場合は、ステップＳ１４０で処理を終了し、ループ処理は行わない。
【０１９８】
ステップＳ１３８で、サブルーチン「要素配置処理」（図３３）を呼ぶ。その際、第１引数（現グループ番号）に１、第２引数（現要素番号）に１、第３引数（現Ｘ座標）に変数ｘ、第４引数（現Ｙ座標）に変数ｙをセットする。
【０１９９】
サブルーチン「要素配置処理」では、最初に、引数で渡される現在の要素をマス目に配置する処理（ステップＳ１６１の各要素のマス目への配置位置保存とステップＳ１６２の重なり要素レベル値設定）を行うとともに、次の要素の処理へつなげる。最後に、ステップＳ１６６で、マス目レベル値クリア処理を実行する。これは引数で指定したレベル値以下、すなわち現要素とその下位レベルの要素のマス目への配置をクリアする処理である。
以下、図３３のフローチャートに沿って説明する。
【０２００】
まず、ステップＳ１６０で、引数をサブルーチン内部変数に取り込む。
【０２０１】
ステップＳ１６１で、各要素のマス目への配置位置を保存する変数５７（図３０。Ｘ座標はＷＸ、Ｙ座標はＷＹ、第１添字はグループ番号、第２添字は要素番号）に現Ｘ座標と現Ｙ座標をセットする。
【０２０２】
ステップＳ１６２で、サブルーチン「マス目レベル値設定処理」（図１９）を呼ぶ。その際、第１引数（グループ番号）に現グループ番号、第２引数（要素番号）に現要素番号、第３引数（Ｘ座標）に現Ｘ座標、第４引数（Ｙ座標）に現Ｙ座標をセットする。
【０２０３】
ステップＳ１６３で、第２引数の現要素番号に１を加算して次要素番号を算出する。次のステップＳ１６４で、この次要素番号がその属するグループの最大要素番号を超えたかどうかを判定し、超えない場合、すなわち次要素番号が存在する場合はステップＳ１６５、超える場合、すなわち次要素番号が存在しない場合はステップＳ１６７を処理する。
【０２０４】
ステップＳ１６５で、サブルーチン「次要素処理」（図３４）を呼ぶ。その際、第１引数（グループ番号）に現グループ番号、第２引数（要素番号）に次要素番号、第３引数（Ｘ座標）に現Ｘ座標、第４引数（Ｙ座標）に現Ｙ座標をセットする。その処理後ステップＳ１６６へ行く。
【０２０５】
ステップＳ１６７で、第１引数の現グループ番号に１を加算した値を次グループ番号とする。次のステップＳ１６８で、この次グループ番号がメモリ０２（図３０）のグループ数５２を超えたかどうかを判定し、超えない場合、すなわち次グループ番号が存在する場合はステップＳ１６９、超える場合、すなわち次グループ番号が存在しない場合はステップＳ１７０の出力処理を実行し、ステップＳ１７１で出力件数を１加算する。
【０２０６】
ステップＳ１７２で、出力件数が１を超えたかどうかを判定し、１を越えた場合はステップＳ１７３で画面（画面２８又は画面２９）に「唯一解ではありません」というメッセージを出力後、処理を終了する。
【０２０７】
１を超えない場合は、画面（画面２８又は画面２９）の件数欄４６に「１」を出力し、ステップＳ１６６へ行く。
【０２０８】
ステップＳ１６９で、サブルーチン「次グループ処理」（図３５）を呼ぶ。その際、引数（グループ番号）に次グループ番号をセットする。
【０２０９】
ステップＳ１７０で、メモリ０２に保存されている組み合わせデータを唯一解レコードとして外部メモリ０１に出力する。出力項目は図３６のとおり。
・  ＩＤはこのレコードの連番である。
・  このレイアウトのＰ１以降は、グループ数が５で、各グループの要素数が７−７−７−５−５の場合の各マス目の位置を示す文字列（Ａ１、Ａ２・・Ｆ５等）を保存する項目である。
・  Ｐ１以降のマス目の位置が初期配置する場合は、マス目の位置を示す文字列の末尾に＊（アスタリスク）を付加する。
【０２１０】
サブルーチン「次要素処理」（一段階方式）では、引数で渡された現在の要素の位置を基点にして、上、下、右、左のマス目を次の要素の位置として配置処理を行う。又は、次要素が初期配置済の場合は次要素の配置処理を行う。
以下、図３４のフローチャートに沿って説明する。
【０２１１】
まず、ステップＳ１８０で、引数をサブルーチン内部変数に取り込む。
【０２１２】
ステップＳ１８１で、次要素が初期配置されているかどうかを判定し、設定済の場合はステップＳ１８６へ行き、未設定の場合は、ステップＳ１８２へ行く。なお、初期配置における同一グループ内の要素は必ず上下左右に隣り合って配置されているものとする。
【０２１３】
例えば、図２９のようにＴ１とＴ２はそれぞれＤ列２行、Ｃ列２行に配置され、左右に隣り合って配置されている。従って、このサブルーチンでは、初期配置がなければ、Ｔ２の配置位置はＤ列１行、Ｄ列３行、Ｅ列２行、Ｃ列２行の４つになるが、初期配置がある場合は残りの３つの配置は対象外になる。以下、ステップＳ１８２からＳ１８５は初期配置がない場合に実行する。
【０２１４】
ステップＳ１８２で、サブルーチン「次要素配置処理」を呼ぶ。その際、第１引数（方向）に「上」、第２引数（グループ番号）に現グループ番号、第３引数（要素番号）に次要素番号、第４引数（Ｘ座標）に現Ｘ座標、第５引数（Ｙ座標）に現Ｙ座標をセットする。
【０２１５】
ステップＳ１８３で、サブルーチン「次要素配置処理」を呼ぶ。その際、第１引数（方向）に「下」、第２引数（グループ番号）に現グループ番号、第３引数（要素番号）に次要素番号、第４引数（Ｘ座標）に現Ｘ座標、第５引数（Ｙ座標）に現Ｙ座標をセットする。
【０２１６】
ステップＳ１８４で、サブルーチン「次要素配置処理」を呼ぶ。その際、第１引数（方向）に「右」、第２引数（グループ番号）に現グループ番号、第３引数（要素番号）に次要素番号、第４引数（Ｘ座標）に現Ｘ座標、第５引数（Ｙ座標）に現Ｙ座標をセットする。
【０２１７】
ステップＳ１８５で、サブルーチン「次要素配置処理」を呼ぶ。その際、第１引数（方向）に「左」、第２引数（グループ番号）に現グループ番号、第３引数（要素番号）に次要素番号、第４引数（Ｘ座標）に現Ｘ座標、第５引数（Ｙ座標）に現Ｙ座標をセットする。
【０２１８】
ステップＳ１８２からステップＳ１８５までの処理が終了したらサブルーチンから元の処理に戻る。
【０２１９】
ステップＳ１８６は制約条件としての初期配置がある場合の処理である。ここでは、メモリ０２（図３０）の各要素のマス目への処理配置位置５８から、次要素の初期配置座標を読み取り、次Ｘ座標、次Ｙ座標とする。
【０２２０】
ステップＳ１８７で、サブルーチン「要素配置処理」（図３３）を呼ぶ。その際、第１引数（現グループ番号）に現グループ番号、第２引数（現要素番号）に次要素番号、第３引数（現Ｘ座標）に次Ｘ座標、第４引数（現Ｙ座標）に次Ｙ座標をセットする。
【０２２１】
当サブルーチン処理を終了し、元の処理に戻る。
【０２２２】
サブルーチン「次グループ処理」（一段階方式）は、第２グループ以降の各グループの第１要素を配置する処理である。
以下、図３５のフローチャートに沿って説明する。
【０２２３】
ステップＳ１９０で、引数の次グループ番号をサブルーチン内部変数ｇに取り込む。
【０２２４】
ステップＳ１９１で、ループ処理で使用するマス目のＸ座標（列番号）変数ｘとＹ座標（行番号）変数ｙを１に初期化し、ステップＳ１９９とステップＳ２０１で変数ｘと変数ｙに１を加算しながら、ステップＳ１９２とステップＳ１９３で変数ｘと変数ｙの上限チェックを行い、ステップＳ１９４からステップＳ１９８の処理を繰り返す。
【０２２５】
ステップＳ１９４で、第ｇグループ第１要素の初期配置設定値ＷＸＩ（ｇ，１）が０、すなわち未設定ならばＳ１９６へ行き、通常のループ処理を行う。設定済ならばステップＳ１９５を実行し、第ｇグループ第１要素の初期配置設定値ＷＸＩ（ｇ，１）をｘに、ＷＹＩ（ｇ，１）をｙにセットする。また、この場合は、ステップＳ２００で処理を終了し、ループ処理は行わない。
【０２２６】
ステップＳ１９６で、サブルーチン「重なり配置可能チェック」を呼ぶ。その際、第１引数（Ｘ座標）にＸ座標（列番号）変数ｘ、第２引数（Ｙ座標）にＹ座標（行番号）変数ｙをセットする。その結果により、配置可能であればステップＳ１９８の要素配置処理を実行し、配置不可であればステップＳ１９９へ行く。
【０２２７】
サブルーチン「重なり配置可能チェック」では、引数で指定された座標のマス目に重なり配置が可能かどうかをチェックし、配置可能なら戻り値をチェックＯＫとし、配置不可なら戻り値をチェックＮＧとする。
【０２２８】
ステップＳ１９８で、サブルーチン「要素配置処理」を呼ぶ。その際、第１引数（現グループ番号）に次グループ番号、第２引数（現要素番号）に１、第３引数（現Ｘ座標）に変数ｘ、第４引数（現Ｙ座標）に変数ｙをセットする。
【０２２９】
以下に、隣接定義がされている要素配置場所が配された平面を使った実施例２を説明する。図３７（ａ）のような、複数の要素配置場所があって、各要素配置場所がどの要素配置場所と隣接するかが、現実の地理区域や線路・航路に基づいてあらかじめ定義されている平面と、以下のような複数の旅程が提示され、唯一の配置法を見つけるパズルである。
（１）  佐渡金山−善光寺−山中湖−寸又峡
（２）  一乗谷−兼六園−白川郷
（３）  黒部ダム−長良川鵜飼−犬山城
【０２３０】
上記観光地を所在地都道府県に置き換えると次のようになる。
（１）  新潟−長野−山梨−静岡
（２）  福井−石川−岐阜
（３）  富山−岐阜−愛知
【０２３１】
この３つの旅程は次の３つのグループの要素に対応する。グループの順番は要素数の降順とする。
（１）  Ｐ１−Ｐ２−Ｐ３−Ｐ４（第１グループの４つの要素）
（２）  Ｑ１−Ｑ２−Ｑ３（第２グループの３つの要素）
（３）  Ｒ１−Ｒ２−Ｒ３（第３グループの３つの要素）
【０２３２】
以上のグループ要素が図３７（ａ）のような要素配置場所に配置する方法はただ一通り  かの判定を行う装置について、図４２以降のフローチャートに沿って説明する。
【０２３３】
ステップＳ２１０で、隣接定義方式唯一解判定画面（図３９）の配置場所数６０、グループ数６１、各グループの要素数６２、初期配置設定６３、配置場所間隣接定義６４をメモリ０２（図４０）の対応する変数領域（配置場所数７０、グループ数７１、各グループの要素数７２、その他）にセットする。その他については下記で詳述する。
【０２３４】
入力されたグループの要素数の合計値から配置場所数を減算した値をメモリ０２（図４０）の重なり要素数７３にセットするとともに、画面（図３９）の重なり要素数６６にセットする。この実施例では、第１グループ要素数が４、第２グループ要素数が３、第３グループ要素数が３で、配置場所数が９になるので、重なり要素数は１となる。
【０２３５】
また、配置場所間隣接定義６４をメモリ０２（図４０）の隣接定義７７、すなわちＣ（Ｘ）に保存する。添え字のＸは配置場所を表す数字（実施例では１〜９）であり、以下のように各配置場所との隣接有無を５桁単位の０又は１でセットする。
【０２３６】
例えば、図３８（ａ）の場合は以下のように表す。各要素配置場所（Ｘ１〜Ｘ９）の他要素配置場所（Ｘ１〜Ｘ９）との隣接定義を０（隣接無）と１（隣接有）で表す。自分自身との隣接定義個所は０とし、要素配置場所を５単位に区切り、５に満たない個所は０で埋める。図３８（ａ）の例ではＸ１０は存在しないのでその個所は０とする。
Ｃ（１）・・０１００１  ０００００
Ｃ（２）・・１０１０１  ０００００
Ｃ（３）・・０１０１１  ０１０００
Ｃ（４）・・００１００  ０１０００
Ｃ（５）・・１１１００  １１０００
Ｃ（６）・・００００１  ０１１００
Ｃ（７）・・００１１１  １０１１０
Ｃ（８）・・０００００  １１０１０
Ｃ（９）・・０００００  ０１１００
【０２３７】
制約条件として要素間隣接定義を使用する場合は、隣接定義方式唯一解判定画面（図３９）に「要素間隣接定義」ボタンを追加する。このボタンが押下されたら、要素間隣接定義作成画面（図５０）を表示し、各要素を配置する要素配置場所を指定する。
【０２３８】
図５０の設定例では、要素Ｐ１（第１グループ第１要素）は要素配置場所Ｘ４（新潟）に配置しているがその場合、図３９の配置場所間隣接定義６４よりＸ３（富山）とＸ７（長野）のみに隣接可能なので、Ｒ１（第３グループ第１要素）とＰ２（第１グループ第２要素）のみに要素間隣接が可能である。
【０２３９】
そこで、「戻る」ボタン押下時に、各要素配置場所における要素間隣接の可否をメモリ０２（図４０）の要素間隣接定義８０、すなわちＤ（Ｘ）に保存する。Ｘは要素を表す数字（実施例では１〜１０）であり、以下のように各要素配置場所との要素間隣接可否を５桁単位の０又は１でセットする。
【０２４０】
例えば、図３９、図５０の場合は以下のようになる。各要素（Ｐ１〜Ｐ４、Ｑ１〜Ｑ３、Ｒ１〜Ｒ３）の他要素との要素間隣接定義を０（隣接不可）と１（隣接可）で表す。自分自身との要素間隣接定義個所は０とし、要素配置場所を５単位に区切り、５に満たない個所は０で埋める。
【０２４１】
以下左列からＰ１、Ｐ２、Ｐ３、Ｐ４、Ｑ１、Ｑ２、Ｑ３、Ｒ１、Ｒ２、Ｒ３の順に隣接可否（１／０）をセット
Ｐ１・・Ｄ（１）・・０１０００  ００１００
Ｐ２・・Ｄ（２）・・１０１１０  ０１１１１
Ｐ３・・Ｄ（３）・・０１０１０  ０００００
Ｐ４・・Ｄ（４）・・０１１００  ０００００
Ｑ１・・Ｄ（５）・・０００００  １１０１０
Ｑ２・・Ｄ（６）・・００００１  ０１１１０
Ｑ３・・Ｄ（７）・・０１００１  １０１０１
Ｒ１・・Ｄ（８）・・１１０００  １１０１０
Ｒ２・・Ｄ（９）・・０１００１  １０１０１
Ｒ３・・Ｄ（１０）・０１０００  ０１０１０
【０２４２】
ステップＳ２１１で、ステップＳ２１０で読み込んだ初期配置設定６３を配置場所初期配置要素レベル値７６、すなわち配列変数ＬＩ（Ｌ，Ｘ）に保存する。Ｌは重なり順位、Ｘは配置場所を表す数字（実施例では１〜９）で、グループ番号（実施例では１〜３）に１００を掛けた値に要素番号（実施例では１〜４）を加算した値をセットし、未設定の場合は０をセットする。
【０２４３】
初期配置の段階で１つの配置場所に２つの要素が重なる場合は、グループ番号の昇順に、最初の要素ではＬ＝１、次の要素ではＬ＝２となる。例えば、第２グループ第３要素と第３グループ第２要素が配置場所Ｘ＝５で重なっている場合は、ＬＩ（１，５）に２０３、ＬＩ（２，５）に３０２をセットする。
【０２４４】
また、初期配置設定６３は各要素配置場所初期値７９、すなわち配列変数ＷＩ（Ｇ，Ｅ）にも保存する。Ｇはグループ番号、Ｅは要素番号で、配置場所を表す数字（実施例では１〜９）をセットし、未設定の場合は０をセットする。図４０の実施例ではグループ数の最大値を５、要素数の最大値を７としてメモリ領域を確保している。
【０２４５】
ステップＳ２１２で、ループ処理で使用する要素配置場所の座標変数ｘを１に初期化し、ステップＳ２１９で変数ｘに１を加算しながら、ステップＳ２１３で変数ｘの上限チェックを行い、ステップＳ２１４からステップＳ２１９の処理を繰り返す。配置場所数が９の実施例では、この処理を９回（変数ｘを１〜９）繰り返すことになる。
【０２４６】
ステップＳ２１４で、配置場所初期配置要素レベル値７６を配置場所配置要素レベル値７５にコピーする。また、各要素配置場所初期値７９を各要素配置場所７８にコピーする。
【０２４７】
ステップＳ２１５で、第１グループ第１要素の各要素配置場所初期値ＷＩ（１，１）が０（未設定）ならばＳ２１７へ行き、通常のループ処理を行う。設定済ならばステップＳ２１６を実行し、第１グループ第１要素の初期配置設定値ＷＩ（１，１）をｘにセットする。また、この場合は、ステップＳ２１８で処理を終了し、ループ処理は行わない。
【０２４８】
ステップＳ２１７で、サブルーチン「要素隣接配置処理」（図４３）を呼ぶ。その際、第１引数（現グループ番号）に１、第２引数（現要素番号）に１、第３引数（現配置場所）に変数ｘをセットする。
【０２４９】
サブルーチン「要素隣接配置処理」では、最初に、引数で渡される現在の要素を配置する処理（ステップＳ２２１の各要素配置場所への配置位置保存とステップＳ２２２のレベル値設定）を行うとともに、次の要素の処理へつなげる。最後に、ステップＳ２３３で、引数で渡される現在の要素配置場所とその下位レベルの配置をクリアする処理を行う。
以下、図４３のフローチャートに沿って説明する。
【０２５０】
まず、ステップＳ２２０で、引数をサブルーチン内部変数に取り込む。
【０２５１】
ステップＳ２２１で、各要素配置場所を保存する変数７８（図４０。Ｗ、第１添字はグループ番号、第２添字は要素番号）に現配置場所（１〜９）をセットする。
【０２５２】
ステップＳ２２２で、サブルーチン「レベル値設定処理」（図４４）を呼ぶ。その際、第１引数（グループ番号）に現グループ番号、第２引数（要素番号）に現要素番号、第３引数（配置場所）に現配置場所をセットする。
【０２５３】
ステップＳ２２３で、第２引数の現要素番号に１を加算して次要素番号とする。次のステップＳ２２４で、この次要素番号がその属するグループの最大要素番号を超えたかどうかを判定し、超えない場合、すなわち次要素番号が存在する場合はステップＳ２２５、超える場合、すなわち次要素番号が存在しない場合はステップＳ２２６を処理する。
【０２５４】
ステップＳ２２５で、サブルーチン「次要素処理」（図４５）を呼ぶ。その際、第１引数（グループ番号）に現グループ番号、第２引数（要素番号）に次要素番号、第３引数（配置場所）に現配置場所をセットする。その処理後ステップＳ２３３へ行く。
【０２５５】
ステップＳ２２６で、第１引数の現グループ番号に１を加算した値を次グループ番号とする。次のステップＳ２２７で、この次グループ番号がメモリ０２（図４０）のグループ数７１を超えたかどうかを判定し、超えない場合、すなわち次グループ番号が存在する場合はステップＳ２２８、超える場合、すなわち次グループ番号が存在しない場合はステップＳ２２９の出力処理を実行し、ステップＳ２３０で出力件数に１を加算する。
【０２５６】
ステップＳ２２９の出力処理では、メモリ０２（図４０）に保存されている各要素の配置場所データを唯一解レコードとして外部メモリ０１に出力する。出力項目は図４１のとおり。
【０２５７】
出力項目のうち、パターン分類（ＰＴＹＰＥ）は以下のように算出した値をセットする。
（１）  隣接定義の３２進表記
Ｃ（１）からＣ（９）の５桁の２進数を１桁の３２進文字（０〜９，Ａ〜Ｖ）に変換する。
第１要素の隣接定義・・９０
第２要素の隣接定義・・Ｌ０
第３要素の隣接定義・・Ｂ８
第４要素の隣接定義・・４８
第５要素の隣接定義・・ＳＯ
第６要素の隣接定義・・１Ｃ
第７要素の隣接定義・・７Ｍ
第８要素の隣接定義・・０Ｑ
第９要素の隣接定義・・０Ｃ
【０２５８】
（２）  配置場所位相を表す文字列の生成
頭３桁に要素配置場所数、４桁目以降に上記３２進文字列を順に追加して、
００９９０Ｌ０Ｂ８４８ＳＯ１Ｃ７Ｍ０Ｑ０Ｃ
という配置場所位相を表す文字列を生成する。
【０２５９】
（３）  パターン分類の生成
配置場所位相を表す文字列に書くグループの要素数を連結した文字列をパターン分類とする。例えば、要素４−３−３の場合は、以下のようになる。
００９９０Ｌ０Ｂ８４８ＳＯ１Ｃ７Ｍ０Ｑ０Ｃ４３３
【０２６０】
パターン分類を表す記号は、要素配置場所がマス目の場合は、１桁目はマス目の列数、２桁目はマス目の行数、３桁目以降は各グループの要素数とする。要素配置場所の位相の場合は、要素配置場所の位相を表す文字列に続けて各グループの要素数とする。
【０２６１】
ステップＳ２３１で、出力件数が１を超えたかどうかを判定し、１を越えた場合は画面（図３９）に「唯一解ではありません」というメッセージを出力後、処理を終了する。
【０２６２】
１を超えない場合は、画面（図３９）の件数欄６７に「１」を出力し、ステップＳ２３３へ行く。
【０２６３】
ステップＳ２２８で、サブルーチン「次グループ処理」（図４９）を呼ぶ。その際、引数（グループ番号）に次グループ番号をセットする。その処理後ステップＳ２３３へ行く。
【０２６４】
ステップＳ２３３で、現グループ番号に１００を掛けた値に現要素番号を加算した値を引数（レベル値）にセットし、サブルーチン「レベル値クリア処理」を呼ぶ。この処理により現在の設置場所の要素とその下位レベルの要素への配置がすべてクリアされる。
【０２６５】
要素間隣接定義を制約条件として使用する場合は、サブルーチン「要素隣接配置処理」のステップＳ２２７以降は図５１のようになる。
【０２６６】
すなわち、ステップＳ２３４で要素配置組み合わせが要素間隣接定義を満たしているかどうかをチェックし、満たしていればステップＳ２２９以降の処理を行い、満たしていなければステップＳ２３３へ行く。
【０２６７】
サブルーチン「レベル値クリア処理」は、メモリ０２（図４０）の配置場所配置要素レベル値７５の値が引数で指定されたレベル値と同じ又は大きい値の場合にゼロクリアする処理である。これは指定した要素とその下位レベルの要素の配置場所への配置を取り消す処理である。
【０２６８】
当サブルーチン処理を終了し、元の処理に戻る。
【０２６９】
サブルーチン「次要素処理」（図４５）では、現在の要素の配置場所を基点にして隣接する配置場所を次の要素の位置として配置処理を行う。すなわち、第２要素以降の従属要素（直前の配置場所に隣接する配置場所にしか置けない要素）の配置処理である。
以下、図４５のフローチャートに沿って説明する。
【０２７０】
ステップＳ２５０で、引数をサブルーチン内部変数に取り込む。
【０２７１】
ステップＳ２５１で、ループ処理で隣接位置を表す変数として使用する隣接番号に１をセットする。
【０２７２】
ステップＳ２５２で、隣接番号が配置場所数を超えたら、当サブルーチンから元の処理に戻る。超えなければ、ステップＳ２５３以下の処理を実行する。
【０２７３】
ステップＳ２５３で、メモリ０２（図４０）の隣接定義７７の変数Ｃ（添え字が現配置場所）の値（配置場所数の長さの文字列）は現配置場所における他の配置場所との隣接有無が配置場所順にセットされているので、その文字列の頭から隣接番号番目の文字が０なら隣接無と判断しステップＳ２５６へ行く。また１ならば隣接有と判断し、ステップＳ２５５の次要素配置処理を実行する。
【０２７４】
ステップＳ２５５で、サブルーチン「次要素配置処理」を呼ぶ。その際、第１引数に隣接番号、第２引数に現グループ番号、第３引数に次要素番号、第４引数に現配置場所をセットする。
【０２７５】
ステップＳ２５６で隣接番号に１を加算して、ステップＳ２５２に戻る。
【０２７６】
サブルーチン「次要素配置処理」では、引数で指定された隣接番号の配置場所に配置可能かをチェックし、配置可能ならサブルーチン「要素隣接配置処理」を呼ぶ。なお、このサブルーチンはメイン処理のステップＳ２１７で呼ばれたサブルーチンと同一で再帰関数となっている。
以下、図４６のフローチャートに沿って説明する。
【０２７７】
まず、ステップＳ２６０で、引数をサブルーチン内部変数に取り込む。
【０２７８】
ステップＳ２６１で、サブルーチン「配置可能チェック」を呼ぶ。その際、第１引数（次配置場所）に隣接番号をセットする。その結果により、チェックＯＫであればサブルーチン「要素隣接配列処理」を実行する。その際、第１引数に現グループ番号、第２引数に次要素番号、第３引数に次配置場所をセットする。当サブルーチン処理を終了し、元の処理に戻る。
【０２７９】
チェックＮＧであれば当サブルーチン処理を終了し、元の処理に戻る。
【０２８０】
サブルーチン「配置可能チェック」では、引数で指定された配置場所に配置が可能かどうかをチェックし、配置可能なら戻り値をチェックＯＫとし、配置不可なら戻り値をチェックＮＧとする。
以下、図４７のフローチャートに沿って説明する。
【０２８１】
まず、ステップＳ２７０で、引数をサブルーチン内部変数に取り込む。
【０２８２】
ステップＳ２７１で、引数で指定された配置場所１箇所だけで、メモリ０２（図４０）の重なり要素数７３を超えてしまうかどうかをチェックする。
すなわち、Ｌ（２，配置場所）が０以外であれば、チェックＮＧとして当サブルーチン処理を終了し、元の処理に戻る。
【０２８３】
ステップＳ２７２では、メモリ０２（図４０）の重なり要素数７３が１以上の場合に以下のチェックを行う。最初に引数で指定された配置場所について現時点の重なり数に１をプラスした値を算出する。次に、引数で指定された配置場所を除くすべてのマス目において現時点の重なり数を合計した値を算出する。そして、両者を合わせた値が重なり要素数を超えてしまうかどうかをチェックする。超えた場合はチェックＮＧ、超えない場合はチェックＯＫとして当サブルーチン処理を終了し、元の処理に戻る。
【０２８４】
サブルーチン「次グループ処理」は、第２グループ以降の第１要素（独立要素）を配置する処理である。
以下、図４９のフローチャートに沿って説明する。
【０２８５】
ステップＳ２９０で、引数の次グループ番号を内部変数ｇに取り込む。
【０２８６】
ステップＳ２９１で、ループ処理で使用する配置場所数を保持する変数ｘを１に初期化し、ステップＳ２９６で変数ｘに１を加算しながら、ステップＳ２９２で変数ｘの上限チェックを行い、ステップＳ２９３からステップＳ２９５の処理を繰り返す。
【０２８７】
ステップＳ２９３で、サブルーチン「配置可能チェック」（既出）を呼ぶ。その際、引数に変数ｘをセットする。その結果により、配置可能であればステップＳ２９５で要素隣接配置処理（既出、再帰関数）を実行した後にステップＳ２９６へ行く。配置不可であればステップＳ２９６へ行く。
【０２８８】
ステップＳ２９５で、サブルーチン「要素配置処理」を呼ぶ際、第１引数（現グループ番号）に次グループ番号、第２引数（現要素番号）に１、第３引数（配置場所）に変数ｘをセットする。
【０２８９】
次に、以上の装置により算出された唯一解を利用したパズルの提供方法について、五・七・五の俳句を題材とした実施例１と、都道府県の観光地の旅程を題材とした実施例２を説明する。
【０２９０】
実施例１は、図１（ａ）のような３つの句からなる俳句と、図１（ｂ）のような制約条件としていくつかのモーラが配置された縦４列横４行に区切られたマス目の描かれた平面を提示し、残りのモーラの配置を探すパズルゲームへの応用である。
ルールは以下のとおりとする。
【０２９１】
（１）  各グループの第１要素は配置場所のいずれにも配置することができる。（この性質を「独立」という）
（２）  １つのグループに属する隣り合う要素は隣接して配置（マス目の場合は上下左右に配置）しなければならない。すなわち、第２要素以降は直前の要素に隣接して配置する。（この性質を「従属」という）
（３）  １つのグループに属する要素同士は、同じ要素であっても１つの配置場所に重ねて配置することができない。
（４）  異なるグループに属する要素同士は、同じ要素であれば１つの配置場所に重ねて配置することができる。
（５）  配置場所に空きが出来ないように、提示されたグループの要素すべてを配置場所に配置する。
【０２９２】
第１グループ「かわずとびこむ」、第２グループ「ふるいけや」、第３グループ「みずのおと」の中で、
第１グループ第３要素（Ｐ３）と第３グループ第２要素（Ｒ２）および、第１グループ第４要素（Ｐ４）と第３グループ第５要素（Ｒ５）のそれぞれの要素が共通で、このいずれか１つが重なる場合なので、重なり要素関係分類は「Ｐ３Ｒ２＋Ｐ４Ｒ５」になる。
【０２９３】
別の例として、第１グループ「つるべとられて」、第２グループ「あさがおに」、第３グループ「もらいみず」の中で、第１グループ第５要素（Ｐ５）と第３グループ第２要素（Ｒ２）の要素が共通なので、重なり要素関係分類は「Ｐ５Ｒ２」になる。
【０２９４】
別の例として、第１グループ「うしにひかれて」、第２グループ「はるかぜや」、第３グループ「ぜんこうじ」の中で、第１グループ第１要素（Ｐ１）と第３グループ第４要素（Ｒ４）および、第１グループ第５要素（Ｐ５）と第２グループ第３要素（Ｑ３）および、第２グループ第４要素（Ｑ４）と第３グループ第１要素（Ｒ１）のそれぞれの要素が共通で、このいずれか１つが重なる場合なので、重なり要素関係分類は「Ｐ１Ｒ４＋Ｐ５Ｑ３＋Ｑ４Ｒ１」になる。
【０２９５】
実施例１では重なり数が１なので、重なり要素関係分類は、以下のようになる。
（１）  共通モーラが１組の場合
第１グループ第３要素（Ｐ３）と第３グループ第２要素（Ｒ２）なら「Ｐ３Ｒ２」になる。
（２）  共通モーラが２組の場合
「Ｐ３Ｒ２＋Ｐ４Ｒ５」のように＋記号で２つの組を合併する。
これは「第１グループ第３要素（Ｐ３）と第３グループ第２要素（Ｒ２）とが重なる組み合わせ、又は、第１グループ第４要素（Ｐ４）と第３グループ第５要素（Ｒ５）とが重なる組み合わせのいずれか」という意味である。
（３）  共通モーラが３組の場合
「Ｐ３Ｒ２＋Ｐ４Ｒ３＋Ｐ６Ｑ５」のように３つの組み合わせを＋記号で合併する。
【０２９６】
重なり要素関係分類は「Ｐ３Ｒ２＋Ｐ４Ｒ５」は、重なり要素関係分類「Ｐ３Ｒ２」の配置組み合わせと重なり要素関係分類「Ｐ４Ｒ５」の配置組み合わせを合併したものになる。
【０２９７】
要素関係分類が「Ｐ３Ｒ２＋Ｐ４Ｒ５」の組み合わせレコードは１４０８件あるが、制約条件の優先順位第１位である各グループの第１要素位置、すなわち、第１グループ第１要素（Ｐ１）と第２グループ第１要素（Ｑ１）と第３グループ第１要素（Ｒ１）の３つの要素をキーに集計して作成した集計結果レコードの集計レコード件数が１件の集計結果レコード（唯一レコード）は１８４件あり、パズル問題はこの唯一レコードから作成することができる。
【０２９８】
実施例１では重なり数は１だったが、重なり数が２の場合は、重なり要素関係分類は、以下のようになる。
（１）  共通モーラが２組の場合
「Ｐ３Ｒ２＊Ｐ４Ｒ５」のように＊記号で２つの組を結合する。これは「第１グループ第３要素（Ｐ３）と第３グループ第２要素（Ｒ２）とが重なる組み合わせと、第１グループ第４要素（Ｐ４）と第３グループ第５要素（Ｒ５）とが重なる組み合わせの共通部分」という意味である。
（２）  共通モーラが３組の場合
「Ｐ３Ｒ２＊Ｐ４Ｒ３＋Ｐ３Ｒ２＊Ｐ６Ｑ５＋Ｐ４Ｒ３＊Ｐ６Ｑ５」のように３つの共通部分を＋記号で合併する。
（３）  共通モーラが４組の場合
４組の中から２組を選んで作成した６つの共通部分を＋記号で合併する。例えば、Ｐ３Ｒ２をＡ、Ｐ４Ｒ３をＢ、Ｐ６Ｑ５をＣ、Ｑ２Ｒ４をＤと置き換えた場合、以下のようになる。
Ａ＊Ｂ＋Ａ＊Ｃ＋Ａ＊Ｄ＋Ｂ＊Ｃ＋Ｂ＊Ｄ＋Ｃ＊Ｄ
【０２９９】
重なり数が３の場合は、重なり要素関係分類は、以下のようになる。
（１）  共通モーラが３組の場合
「Ｐ３Ｒ２＊Ｐ４Ｒ５＊Ｐ６Ｑ５」のように＊記号で３つの組を合併する。これは「第１グループ第３要素（Ｐ３）と第３グループ第２要素（Ｒ２）とが重なる組み合わせと、第１グループ第４要素（Ｐ４）と第３グループ第５要素（Ｒ５）とが重なる組み合わせと、第１グループ第６要素（Ｐ６）と第２グループ第５要素（Ｑ５）とが重なる組み合わせの共通部分」という意味である。
（２）  共通モーラが４組の場合
４組の中から３組を選んで作成した４つの共通部分を＋記号で合併する。例えば、Ｐ３Ｒ２をＡ、Ｐ４Ｒ５をＢ、Ｐ６Ｑ５をＣ、Ｑ２Ｒ４をＤと置き換えた場合、以下のようになる。
Ａ＊Ｂ＊Ｃ＋Ａ＊Ｂ＊Ｄ＋Ａ＊Ｃ＊Ｄ＋Ｂ＊Ｃ＊Ｄ
【符号の説明】
【０３００】
０１  外部メモリ
０２  メモリ
０３  ディスプレイ
０４  キーボード
０５  ＣＰＵ
１１  メモリの列数保存領域
１２  メモリの行数保存領域
１３  メモリのグループ数保存領域
１４  メモリの各グループ要素数保存領域
１５  メモリの重なり要素数保存領域
１６  メモリの重なり要素レベル値保存領域
１７  メモリの各要素のマス目への配置位置保存領域
２０  配置組み合わせ出力部画面の列数入力テキストボックス
２１  配置組み合わせ出力部画面の行数入力テキストボックス
２２  配置組み合わせ出力部画面のグループ数入力テキストボックス
２３  配置組み合わせ出力部画面のグループ要素数入力テキストボックス
２４  配置組み合わせ出力部画面の処理実行開始ボタン
２５  配置組み合わせ出力部画面の重なり要素数表示領域
２６  配置組み合わせ出力部画面の件数表示領域
３０  唯一解出力部画面のパターン分類選択コンボボックス
３１  唯一解出力部画面の重なり要素関係分類選択コンボボックス
３２  唯一解出力部画面の制約条件優先順位入力領域
３３  唯一解出力部画面の唯一解件数
３４  唯一解出力部画面の処理実行開始ボタン
４０  一段階方式唯一階算出画面の列数入力テキストボックス
４１  一段階方式唯一階算出画面の行数入力テキストボックス
４２  一段階方式唯一階算出画面のグループ数入力テキストボックス
４３  一段階方式唯一階算出画面のグループ要素数入力テキストボックス
４４  一段階方式唯一階算出画面の処理実行開始ボタン
４５  一段階方式唯一階算出画面の重なり要素数表示領域
４６  一段階方式唯一階算出画面の件数表示領域
４７  一段階方式唯一階算出画面の制約条件（グループ要素単位）入力コンボボックス
４８  一段階方式唯一階算出画面の制約条件（マス目単位）入力コンボボックス
４９  一段階方式唯一階算出画面の画面切り替えボタン
５０  メモリ（一段階方式）の列数保存領域
５１  メモリ（一段階方式）の行数保存領域
５２  メモリ（一段階方式）のグループ数保存領域
５３  メモリ（一段階方式）の重なり要素数保存領域
５４  メモリ（一段階方式）の各グループ要素数保存領域
５５  メモリ（一段階方式）の重なり要素レベル値保存領域
５６  メモリ（一段階方式）の初期配置重なり要素レベル値保存領域
５７  メモリ（一段階方式）の各要素のマス目への配置位置保存領域
５８  メモリ（一段階方式）の各要素のマス目への初期配置位置保存領域
６０  隣接定義方式唯一階算出画面の配置場所数入力テキストボックス
６１  隣接定義方式唯一階算出画面のグループ数入力テキストボックス
６２  隣接定義方式唯一階算出画面のグループ要素数テキストボックス
６３  隣接定義方式唯一階算出画面の初期配置設定入力コンボボックス
６４  隣接定義方式唯一階算出画面の配置場所間隣接定義チェックボックス
６５  隣接定義方式唯一階算出画面の処理実行開始ボタン
６６  隣接定義方式唯一階算出画面の重なり要素数表示領域
６７  隣接定義方式唯一階算出画面の件数表示領域
６８  隣接定義方式唯一階算出画面の隣接定義の双方向・単方向切り替えボタン
６９  隣接定義方式唯一階算出画面の単方向設定の場合の逆方向隣接定義領域
Ｘｎ→Ｘｍ（ｎ＞ｍ）の隣接定義も独立に設定可能になる
７０  メモリ（隣接定義方式）の配置場所数保存領域
７１  メモリ（隣接定義方式）のグループ数保存領域
７２  メモリ（隣接定義方式）の各グループ要素数保存領域
７３  メモリ（隣接定義方式）の重なり要素数保存領域
７４  メモリ（隣接定義方式）の重なり配置場所保存領域
７５  メモリ（隣接定義方式）の配置場所配置要素レベル値保存領域
７６  メモリ（隣接定義方式）の配置場所初期配置要素レベル値保存領域
７７  メモリ（隣接定義方式）の隣接定義保存領域
７８  メモリ（隣接定義方式）の各要素配置場所保存領域
７９  メモリ（隣接定義方式）の各要素配置場所初期値保存領域
８０  メモリ（隣接定義方式）の要素間隣接定義保存領域
９０  要素間隣接定義作成画面の要素を示す記号
９１  要素配置場所を選択するコンボボックス
９２  メモ入力欄。要素名を記述
９３  戻るボタン
【図１】
2013078484.tif 000003
【図２】
2013078484.tif 000004
【図３】
2013078484.tif 000005
【図４】
2013078484.tif 000006
【図５】
2013078484.tif 000007
【図６】
2013078484.tif 000008
【図７】
2013078484.tif 000009
【図８】
2013078484.tif 000010
【図９】
2013078484.tif 000011
【図１０】
2013078484.tif 000012
【図１１】
2013078484.tif 000013
【図１２】
2013078484.tif 000014
【図１３】
2013078484.tif 000015
【図１４】
2013078484.tif 000016
【図１５】
2013078484.tif 000017
【図１６】
2013078484.tif 000018
【図１７】
2013078484.tif 000019
【図１８】
2013078484.tif 000020
【図１９】
2013078484.tif 000021
【図２０】
2013078484.tif 000022
【図２１】
2013078484.tif 000023
【図２２】
2013078484.tif 000024
【図２３】
2013078484.tif 000025
【図２４】
2013078484.tif 000026
【図２５】
2013078484.tif 000027
【図２６】
2013078484.tif 000028
【図２７】
2013078484.tif 000029
【図２８】
2013078484.tif 000030
【図２９】
2013078484.tif 000031
【図３０】
2013078484.tif 000032
【図３１】
2013078484.tif 000033
【図３２】
2013078484.tif 000034
【図３３】
2013078484.tif 000035
【図３４】
2013078484.tif 000036
【図３５】
2013078484.tif 000037
【図３６】
2013078484.tif 000038
【図３７】
2013078484.tif 000039
【図３８】
2013078484.tif 000040
【図３９】
2013078484.tif 000041
【図４０】
2013078484.tif 000042
【図４１】
2013078484.tif 000043
【図４２】
2013078484.tif 000044
【図４３】
2013078484.tif 000045
【図４４】
2013078484.tif 000046
【図４５】
2013078484.tif 000047
【図４６】
2013078484.tif 000048
【図４７】
2013078484.tif 000049
【図４８】
2013078484.tif 000050
【図４９】
2013078484.tif 000051
【図５０】
2013078484.tif 000052
【図５１】
2013078484.tif 000053