説明

要素配置唯一解算出装置およびそのパズルへの応用方法

【課題】 平面上に複数の要素配置場所を用意し、提示された複数個のグループの各要素をその上に配置するパズルにおいて、配置組み合わせの中から唯一解を探し出す、図形的な興趣性と複雑性に富んだパズルゲームを提供する。
【解決手段】 各要素配置場所がどの要素配置場所と隣接するかが定義されている平面上で、提示された各グループの第1要素は独立して配置可能で、第2要素以降は直前の要素に隣接して配置可能で、異なるグループの同一要素は同一配置場所で重ねて配置可能という条件を満たして、配置場所に空きが無いように全要素を配置する唯一解をあらかじめコンピュータで算出し、その中からパズルを出題する。

【発明の詳細な説明】
【技術分野】
【0001】
この発明は、提示された複数のグループの要素を平面に配置する唯一の方法を算出する装置に関し、また、それに基づくパズルへの応用方法に関する。
【背景技術】
【0002】
縦横に区切られたマス目に文字を置く代表的なパズルにクロスワードパズルがあり、ヒントから語句を推理し、ヒントで指定されたマス目位置に、縦横の語句の共通文字がクロスするマス目で重なるように語句をマス目に割り当てていくゲームであり、クロスワードパズルを自動生成する装置が考案されている(特許文献1)。
【0003】
また、縦4列横4行の16個のマス目に区切られた画面を、与えられたヒントに基づいて分割するゲーム(特許文献2)が考案されている。
【先行技術文献】
【特許文献】
【0004】
【特許文献1】特許公開平8‐309021
【特許文献2】特許公開2010‐075347
【発明の概要】
【発明が解決しようとする課題】
【0005】
しかしながら、特許文献1の考案は、ヒントから語句を推測し、その長さや縦横の関係から適当な語句を探し出すことに興趣の中心があり、また、文字の置き方は縦横いずれかの一直線上であり、図形的な興趣性に欠ける。
【0006】
また、唯一解に基づく出題ではないので、語句ごとにヒントを用意し、配置位置も指定する必要がある。
【0007】
また、出題をコンピュータで自動的に行うためには、相当数の語句とヒントを予めデータベースとして用意しておく必要がある。
【0008】
特許文献2の考案は、縦横に区切られたマス目にグループの要素を配置する唯一の方法を見つけ出すパズルという点では当発明と同じだが、縦4列横4行のマス目をテトロミノという4つの連続する正方形を要素とする図形で4つに分割するパズルであり、マス目の縦横の数が4に固定され、マス目の上の要素の重なりを認めず、グループの数と各グループの要素数が任意に設定できないため、グループの要素をマス目に置く配置組み合わせ数が少なく、パズルとしての応用の広さと複雑性に欠ける。
【0009】
そこで、この発明は平面上に複数の要素配置場所があって、各要素配置場所がどの要素配置場所と隣接するかがあらかじめ定義(以下「隣接定義」という)されていて、提示された複数個のグループ(語句や数字列、旅程、鉄道ダイヤ、製品供給物流連鎖等)の順序を有する要素(文字や数字、観光地、鉄道停車駅、製品供給物流企業等)をその要素配置場所に配置する際に、
(1) 各グループ単位に隣接する要素配置場所に順序に従い連続して配置する。
(2) 要素が置かれていない要素配置場所が無いようにする。
(3) 同一グループに属する要素は同一であっても1つの要素配置場所に重ねて配置することはできない。
(4) 異なるグループに属する同一の要素は1つの要素配置場所に重ねて配置することができる。
というルールに基づく要素配置場所と要素の配置組み合わせの中で、制約条件として一部の要素の要素配置場所をあらかじめ指定するか、又は、要素と要素が隣接可能かどうかの定義(以下「要素間隣接定義」という)を設定することで、唯一の配置法になるような解(以下「唯一解」という)を算出する装置を提供し、また、唯一解を基にパズルを提供することを課題とする。
【課題を解決するための手段および発明の効果】
【0010】
最初に、唯一解の算出装置について説明し、その後にその唯一解を利用したパズルの提供方法について説明する。平面上での要素配置場所の配置形状は、要素配置場所の数および隣接定義(以下「配置場所位相」という)で表現するが、配置形状がマス目の場合は簡単のために列数と行数で表すこととする。
【0011】
唯一解の算出装置は、指定されたパターン分類(配置場所位相又はマス目の列数と行数、および各グループの要素数を特定する分類)において、あらかじめ一部の要素の要素配置場所への配置又は要素間隣接定義又はその両方(以下「制約条件」という)を指定した状態のもとで、唯一解かどうかを判定する。
【0012】
配置場所位相又はマス目の列数と行数(以下「配置場所形状」という)と、グループ数と各グループの要素数(以下「グループ要素数」という)を入力するための入力部と、計算実行命令を受けて、提示されたグループの要素を要素配置場所に配置するすべての組み合わせをパターン分類ごとに算出する制御部と、その結果をレコードとして出力する出力部を備えた配置組み合わせ出力部(一段階部分)と、
配置組み合わせ出力結果に対し、パターン分類と重なり要素関係分類(下記参照)を選択し、唯一解にするための各種制約条件、又はその適用優先順位を指定する入力部と、計算実行命令を受けて、指定された制約条件を満たす唯一解を算出する制御部と、その結果をレコードとして出力する出力部を備えた唯一解出力部(二段階部分)と、
の2つの部分から構成される二段階方式唯一解算出装置およびプログラムを提供する。
【0013】
ここで「重なり要素関係分類」とは、グループ番号と要素番号で特定する要素と別の要素とが任意の要素配置場所で重なっている関係で、その積集合(複数の関係が同時に成り立つ)、和集合(いずれかの関係が成り立つ)、および重なりのない集合(空集合)を含めての関係である。
【0014】
従って、所望のパターン分類と重なり要素関係分類ごとの唯一解を算出し、一度に多数の唯一解レコードとして出力することができ、そこからパズル問題を多数作成することができる。
【0015】
全グループの要素数の合計から要素配置場所数を差し引いた数(以下、「重なり数」という)や要素配置場所数が大きくなると二段階方式による唯一解算出はパソコンの能力を超えたものになる。
【0016】
例えば、要素配置場所が縦4列横4行の16個のマス目の場合、要素のマス目への置き方の組み合わせ数は、第1グループの要素数が7、第2グループの要素数が5、第3グループの要素数が4、第4グループの要素数が3(以下「要素7−5−4−3」と表す)の場合は18,616,320、要素7−4−4−4の場合は25,873,152となり、重なり数が4になると、さらに大きな数になる(図4参照)。また、要素配置場所が縦4列横4行より大きくなる場合も同様である。そこで、簡易な唯一解算出方式としての一段階方式について次に説明する。
【0017】
パターン分類、すなわち配置場所形状とグループ要素数、および制約条件の入力部と、
計算実行命令を受けて、パターン分類および制約条件のもとで要素を要素配置場所に配置する唯一解かどうかの判定を行う制御部と、
唯一解であればその結果を唯一解レコードとして出力する出力部と、
を備えた一段階方式唯一解算出装置およびプログラムを提供する。従って、所望の制約条件のもとで唯一解になるかどうかを短時間で判定できる。
【0018】
要素の要素配置場所への配置の組み合わせ算出については、
各グループの第1要素は他の要素の配置に関わらず配置場所のいずれにも配置することができ(以下この性質を「独立性」という)、
第2要素以降はその属するグループの直前の要素が配置された配置場所に隣接する配置場所(マス目の場合は上下左右のいずれかに隣接するマス目)にしか置けない(以下この性質を「従属性」という)
というルールに基づいているという特徴を有する。
従って、以下のような自然現象や社会現象をパズルとしてモデル化することが可能になる。また、唯一解の条件を満たしたとき、両者の間には1対1対応が成り立つことになり、両者間での双方向の変換が可能になり、様々な現象を分類整理する手法を提供することも可能になる。
【0019】
独立性を有する第1要素と従属性を有する第2要素以下の配置の例として、水面に発生する波を考えれば、石が投げ込まれるなどしてある位置で発生した波は隣接する位置に波を伝えながら広がっていく。その際に、複数の波はある位置では重なり合うことになる。この現象を水面の各位置が要素配置場所で、グループが波、グループの要素がエネルギーとしてモデル化することが可能になる。
【0020】
他の例として、ある島の都市に電車等の交通機関のダイヤ(運行路線)を考える際、島の都市が要素配置場所、運行路線がグループ、その停車駅が要素となる。この場合、すべての都市にいずれかの交通機関の駅を置くとした場合に、どのような組み合わせがあるかをモデル化して扱うことが可能になる。
【0021】
また、他の例として、複数の製品の供給物流連鎖について、地域が要素配置場所、製品がグループ、その供給物流拠点が要素となる。この場合、重なりがあるのはその地域の拠点が複数の製品に部品あるいはサービスを提供していることを意味する。
【0022】
グループの第1要素の独立性と、第2要素以降も同じグループの上位要素に従属するのみであることから、要素配置に関しグループ間で影響を及ぼし合うことはないので、順序は意味を持たない、すなわち、どのグループから配置しても組み合わせは同一になるので、各グループの要素数は、グループ順に対して降順という取り決めにしても問題はない。同じ文字数の場合は提示されたグループの並びに従う。
【0023】
この発明は、配置場所形状とグループ要素数を画面又はテキストデータの読み込みにより設定することが可能で、その設定に基づいて複数のグループの各要素を要素配置場所に配置する方法が制約条件のもとで唯一の配置法かどうかをコンピュータで算出することを特徴とする。従って、任意の形状の要素配置場所に対するパズルの問題を作成することができる。
【0024】
この発明、隣接定義を双方向又は単方向のいずれでも画面又はテキストデータの読み込みにより設定できることを特徴とする。従って、要素配置場所間の双方向、単方向いずれかの隣接関係が定まっている要素配置場所のパズル問題を作成することができる。
【0025】
この発明は、要素間隣接定義を双方向又は単方向のいずれでも画面又はテキストデータの読み込みにより設定することが可能で、その設定に基づいて複数のグループの各要素を要素配置場所に配置する方法が制約条件のもとで唯一の配置法かどうかをコンピュータで算出することを特徴とする。従って、要素間の隣接可否が何らかの決め事によって定まっているパズルの問題を作成することができる。
【0026】
二段階方式は、第一段階で所望のパターン分類のすべての配列組み合わせをレコードとして出力し、第二段階でその中から唯一の配置法になるための制約条件を、各種制約条件の適用優先順位を指定することで、唯一解になるための必要最小限の制約条件を満たす唯一解を一度に多数見つけ出すことができることを特徴とする。従って、必要最小限の制約条件による難易度の高い問題を多数作成できる。
【0027】
二段階方式は、上記の唯一の配置法を、重なり要素関係分類をキーにして分類した配置組み合わせレコードの中から見つけ出すことを特徴とする。従って、パズルで提示するグループ要素間の共通要素により決定される要素関係分類キーを有する唯一解を問題として利用することができる。
【0028】
一段階方式は、制約条件として、画面において1つ又は複数の要素配置場所に配置する要素をコンボボックスで指定しながら、唯一の配置法を短時間で探し出せることを特徴とする。従って、パズルとして面白そうな制約条件が唯一の配置法になるかどうかを判定し、問題としての利用可否を決定できる。
【0029】
この発明は、要素配置場所間の隣接有無を定める隣接定義に加えて、要素と要素の関係における隣接可否を定める要素間隣接定義を制約条件として使用できることを特徴とする。従って、要素が地理区分(国、州、都道府県、星座など)のように、2つの地理区分同士が地理的に現実に隣接しているかどうかが定まっている場合は、その関係を制約条件として使用できる。
【0030】
この発明は、要素配置唯一解算出プログラムにおいて再帰関数を使用することにより、どのような配置場所形状に対しても、プログラムを修正すること無しに対応することができることを特徴とする。
【0031】
この発明は、上記の唯一の配置法を基に、俳句のモーラを縦4列横4行に区切られたマス目に配置するパズルに関して、いくつかのモーラをあらかじめマス目に配置することにより唯一解となる配置組み合わせを見つけ出すパズル問題を提供することを可能にする。ここでモーラとは、一定の時間的長さをもった音の分節単位である。例えば「ハクチョウ」は「ハ」「ク」「チョ」「ウ」という4つのモーラからなり、小書きのヤ、ユ、ヨといった拗音はモーラの単位にはならない。字足らずの16モーラの俳句なら重なり箇所は無く、字余りの18モーラの俳句なら重なり箇所は2箇所になる。
【0032】
この発明は、上記の唯一の配置法を基に、短歌のモーラを縦6列横5行又は縦5列横6行に区切られたマス目に配置するパズルに関して、いくつかのモーラをあらかじめマス目に配置することにより唯一解となる配置組み合わせを見つけ出すパズル問題を提供することを可能にする。
【0033】
この発明は、上記の唯一の配置法を基に、地理区分、天球区分(星座)、又はそれに属する都市、観光地、市町村、天体を要素とし、複数の旅程(移動順序)をグループとして提示し、現実の地理区域や天球区分に基づいて平面上に作成された複数の要素配置場所に配置するパズルに関して、唯一解の配置組み合わせを見つけ出すパズル問題を提供することを可能にする。
【0034】
この発明は、上記の唯一の配置法を基に、駅や港を要素とし、複数の駅や港を停車する列車や船舶航空機のダイヤをグループとして提示し、現実の駅や港の路線に基づいて平面上に作成された複数の要素配置場所に配置するパズルに関して、唯一解の配置組み合わせを見つけ出すパズル問題を提供することを可能にする。
【0035】
この発明において、「入力部」とはキーボード04(図12)又はそれと同様の機能を有するマウス等を使用してディスプレイ03に表示された画面の入力項目にキーインあるいはコンボボックス等を選択することによって、又はテキストファイルから、メモリ02に外部データを取り込むインターフェイスをいう。
【0036】
この発明において、「制御部」とは、実施形態ではCPU05が該当する。
【0037】
この発明において、「出力部」とは、実施形態では配置組み合わせレコードや唯一解レコードの出力先である外部メモリ01又はそれを人間が認識できる形式で表示するディスプレイ03、又はプリンタ06が該当する。
【図面の簡単な説明】
【0038】
【図1】提示された五七五の俳句を縦4列横4行のマス目に配置するパズルの実施例を示す図である。2列1行目のマス目で、第2句(第1グループ)の第4モーラ(第4要素)と第3句(第3グループ)の第5モーラ(第5要素)の共通要素「と」が重なっている。この出題では、提示された俳句(a)を各グループの第1要素の配置をあらかじめ制約条件として設定する(b)ことにより、配置組み合わせ(c)は唯一解になっている。
【0039】
【図2】語句のマス目への配置のルールを例示する図である。(a)は直線配置のみが可能なクロスワードの例。(b)は隣接するマス目へ連続して配置できる当パズルで採用されている配置ルールである。(c)は(b)と同様の配置ルールで13文字(オオニジュウヤホシテントウ)を配置する例である。
【0040】
【図3】グループ要素数別の配置組み合わせ数を示す表で、マス目が縦3列横3行以内の例である。
【0041】
【図4】グループ要素数別の配置組み合わせ数を示す表で、マス目が縦4列横4行の場合である。
【0042】
【図5】グループ要素数別の配置組み合わせ数を示す表で、マス目が縦5列横4行の場合と縦5列横5行の場合である。
【0043】
【図6】縦4列横4行のマス目に複数グループの要素を配置する場合における配置組み合わせレコードの項目レイアウトである。このレコードは各マス目の配置要素と重なりの位置と要素を保存する。図7のレコードと同時に作成する。この実施例では重なり数の最大値を6としている。
【0044】
【図7】縦4列横4行のマス目に要素7−5−5を配置する場合における配置組み合わせレコードの項目レイアウトである。このレコードは各要素のマス目位置と重なりの位置と要素を保存する。図6のレコードと同時に作成する。
【0045】
【図8】唯一解レコードの項目レイアウトである。制約条件が項目P1以降にセットされる。
【0046】
【図9】縦4列横4列のマス目に、要素7−5−5を配置した場合における、「重なり要素関係分類」別の組み合わせレコード件数の一覧表である。組み合わせ欄のP/Q/Rはそれぞれ第1グループ、第2グループ、第3グループを意味し、数字はその中での要素の位置を表す。合計数72320件は、組み合わせパターン(パターン分類番号:44755、図4参照)のレコード数に一致する。
【0047】
【図10】要素5−5−4−3の場合のマス目への配置例を表した図である。2列1行目のマス目で「ホトトギス」の「ス」と「スズメ」の「ス」とが重なっている。
【0048】
【図11】要素7−6−5の場合のマス目への配置例を表した図である。1列2行目のマス目と2列4行目のマス目の2箇所で重なっている。ここでは要素を記号であらわしている。記号の1桁目はグループ順位(P以降の英字)、2桁目は要素順位を表す。
【0049】
【図12】ハードウェアの構成を表した図である。
【0050】
【図13】縦4列横4行のマス目(a)と、その変数と識別名の割り当て(b)を表した図である。マス目に配置する要素を保存するレベル値変数LVの第1添え字Lには重なり順位がセットされる(図14参照)。
【0051】
【図14】二段階方式のメモリ領域を表した図である。この図は、マス目の列数が4、行数が4、グループ数の最大値は5、要素数の最大値は15の場合の変数配置を示している。
【0052】
【図15】二段階方式の配置組み合わせ出力部画面を表した図である。
【0053】
【図16】二段階方式の唯一解出力部画面を表した図である。
【0054】
【図17】配置組み合わせ出力部メイン処理のフローチャートである。
【0055】
【図18】要素配置処理のフローチャートである。サブルーチン「要素配置処理」は再帰関数になっている。すなわちその処理内部で自分自身を呼んでいる。
【0056】
【図19】マス目レベル値設定処理のフローチャートである。
【0057】
【図20】次要素処理のフローチャートである。
【0058】
【図21】次要素配置処理のフローチャートである。
【0059】
【図22】次要素チェック処理のフローチャートである。
【0060】
【図23】重なり配置可能チェック処理のフローチャートである。
【0061】
【図24】マス目レベル値クリア処理のフローチャートである。
【0062】
【図25】次グループ処理のフローチャートである。
【0063】
【図26】唯一解出力部メイン処理のフローチャートである。
【0064】
【図27】縦4列横4列のマス目に、要素7−6−5を配置する場合における、重なり要素関係分類別の配置組み合わせレコード件数の一覧表である。3,388個に分類され、合計数は471,040になる。図4参照。
【0065】
【図28】一段階方式唯一解算出画面その1である。この画面では、制約条件として各グループ各要素のマス目位置を指定することができる。
【0066】
【図29】一段階方式唯一解算出画面その2である。この画面では、制約条件として各マス目の要素を指定することができる。図28と図29のパターン分類は6577755、重なり要素関係分類はR3T2になる。
【0067】
【図30】一段階方式のメモリ領域を表した図である。この図は、マス目の最大列数が9、最大行数が9、グループ数の最大値は9、要素数の最大値は15の場合の変数配置を示している。
【0068】
【図31】一段階方式のメインフローチャートである。
【0069】
【図32】初期配置処理(一段階方式)のフローチャートである。
【0070】
【図33】要素配置処理(一段階方式)のフローチャートである。サブルーチン「要素配置処理」は再帰関数である。
【0071】
【図34】次要素処理(一段階方式)のフローチャートである。
【0072】
【図35】次グループ処理(一段階方式)のフローチャートである。
【0073】
【図36】一段階方式の唯一解レコードの項目レイアウトである。P1以降T5までは要素数7−7−7−5−5の場合の各要素のマス目位置を保持する項目である。初期配置するマス目位置を表す記号の末尾に*(アスタリスク)を付加することとする。
【0074】
【図37】要素配置場所を表した図である。 (a) 配置場所数が9の場合の要素配置場所を表した図である。要素配置場所間の隣接が有る場合は線で結合している。 (b) 縦3列横3行のマス目の隣接有無を線で表したものである。 (c) 要素を都道府県とした実施例である。この場合の隣接有無は都道府県境の有無に一致する。 (d) 縦4列横4行のマス目の3か所は要素を配置できないとした例。 (e) (d)のマス目において、要素が1から5の数字である3つのグループを配置するパズルの例。制約条件としての初期配置が記されている。○で囲まれた数字は重なりを意味する。
【0075】
【図38】隣接定義図を表した図で、「+」は双方向に隣接有、「−」は双方向に隣接無を表している。以下の(a)、(b)、(c)の隣接はいずれも双方向である。 (a) 図37(a)の隣接定義図である。 (b) 図37(b)の隣接定義図である。 (c) 図37(d)の隣接定義図である。
【0076】
【図39】隣接定義方式の唯一解判定画面を表した図である。ここでは、配置場所数9、グループ数3、要素4−3−3、制約条件として配置場所X5に要素Q3とR2を初期配置している。 ・配置場所間隣接定義は各配置場所(X1〜X9)間が隣接有なら「+」、隣接無なら「−」を設定するマトリックスである。 ・初期配置設定は、要素(第1グループ:Pn、第2グループ:Qn、第3グループ:Rn、nは要素番号)とその配置場所(X1〜X9)を指定する。ここでは、要素Q3を配置場所X5、要素R2を配置場所X5と指定しているので、配置場所X5で2つの要素が重なっていることを意味する。 ・デフォルトの隣接定義は双方向とする。従って、Xn→Xm(n<m)を設定すると自動的にXn→Xm(n>m)も設定される。単方向に切り替えると、Xn→Xm(n>m)も独立に設定可能になる。 ・要素間隣接定義を制約条件に加える場合は、画面に「要素間隣接定義」という表示にボタンを追加し、押下されたら要素間隣接定義作成画面(図50)を呼び出すようにする。
【0077】
【図40】隣接定義方式のメモリ領域を表した図である。この図は、配置場所数が9、グループ数の最大値が5、要素数の最大値が7、重なり要素数の最大値が5の場合の変数配置を示している。ただし、ここでは1か所の要素配置場所には最大2つまで要素を重ねることが可能としている。
【0078】
【図41】隣接定義方式の唯一解レコードの項目レイアウトである。P1以降R3までは要素数4−3−3の場合の各要素の配置場所を保持する項目である。初期配置する配置場所の末尾に*(アスタリスク)を付加することとする。
【0079】
【図42】隣接定義方式の唯一解判定処理メイン処理のフローチャートである。
【0080】
【図43】隣接定義方式の要素隣接配置処理のフローチャートである。サブルーチン「要素隣接配置処理」は再帰関数である。
【0081】
【図44】隣接定義方式のレベル値設定処理のフローチャートである。
【0082】
【図45】隣接定義方式の次要素処理のフローチャートである。
【0083】
【図46】隣接定義方式の次要素配置処理のフローチャートである。
【0084】
【図47】隣接定義方式の配置可能チェック処理のフローチャートである。
【0085】
【図48】隣接定義方式のレベル値クリア処理のフローチャートである。
【0086】
【図49】隣接定義方式の次グループ処理のフローチャートである。
【0087】
【図50】要素間隣接定義作成画面である。
【0088】
【図51】要素間隣接定義方式の要素隣接配置処理フローチャートである。図43のステップS227以降の置き換え部分。
【発明を実施するための形態】
【0089】
以下にマス目を使った実施例として、五・七・五の俳句を題材とした実施例1と、隣接定義がされている要素配置場所が配された平面を使った実施例として、都道府県の観光地の旅程を題材とした実施例2を説明する。なお、本発明の理解を助けるため具体的な表現を使用するが、本発明を限定するものではない。
【0090】
実施例1については、五・七・五の俳句の3つの句の、合わせて17個のモーラを縦4列横4行のマス目に、1つの句に属するモーラはその並び順に上下又は左右に連続して配置し、異なる句の同一モーラは重ねて配置することができ、モーラが置かれていないマス目がないように配置するとした場合のすべての配置組み合わせをプログラムにより算出し、その中から指定された制約条件のもとで唯一解を算出する実施例(二段階方式)を最初に説明し、その後に一段階方式を説明する。
【0091】
俳句の場合、句の順番(上句=上五、中句=中七、下句=下五)が意味を持つが、要素のマス目への配置パターンとしては、グループの要素数が降順になっているパターン分類番号が44755(図4を参照。縦4列、横4行、第1グループ要素数7、第2グループ要素数5、第3グループ要素数5。組み合わせ数72,320)の組み合わせと同一になるのでそれを使用する。この場合、「句」は「グループ」、「モーラ」は「要素」に相当し、要素数の降順に中句が第1グループ、上句が第2グループ、下句が第3グループに対応する。
【0092】
組み合わせ出力部プログラムは図12のハードウェア構成における外部メモリ01に格納されていて、プログラム開始時にメモリ02にロードして起動させる。起動すると、ディズプレイ03に図15のような配置組み合わせ出力部画面が表示される。
【0093】
以下、図17以降のフローチャートに沿って、CPU05で実行されるプログラムの流れを説明する。
ステップS1で、キーボード04から入力された配置組み合わせ出力部画面(図15)のマス目の列数20、行数21、グループ数22、各グループの要素数23をメモリ02(図14)の対応する変数領域(列数は11、行数は12、グループ数は13、各グループの要素数は14)にセットする。
【0094】
また、入力されたグループの要素数の合計値からマス目の数を減算した値をメモリ02の重なり要素数15にセットするとともに、配置組み合わせ出力部画面(図15)の重なり要素数25にセットする。この実施例では、第1グループ要素数が7、第2グループ要素数が5、第3グループ要素数が5で、マス目列数が4、行数が4になるので、重なり要素数は1となる。
【0095】
ステップS2で、ループ処理で使用するマス目のX座標(列番号)変数xとY座標(行番号)変数yを1に初期化し、ステップS7とステップS8で変数xと変数yに1を加算しながら、ステップS3とステップS4で変数xと変数yの上限チェックを行い、ステップS5とステップS6の処理を繰り返す。列数が4、行数が4の実施例では、ステップS5とステップS6の処理を16回(変数xを1〜4、変数yを1〜4)繰り返すことになる。
【0096】
ステップS5で、メモリ02(図14)のLV配列変数16(第1重なり要素レベル値から第5重なり要素レベル値まで)をゼロクリアする。なお、この値は各マス目に配置された要素のグループ番号を100の位の1桁の数字で、要素番号を10の位と1の位の2桁の数字で表す。例えば第3グループの第2要素ならば302となる。LV配列変数の第1添字には重なり順位(グループ数の最大値を5にしているので1〜5)、また、第2添字にはX座標、第3添字にはY座標をセットする。
【0097】
ステップS6で、サブルーチン「要素配置処理」を呼ぶ。その際、第1引数(現グループ番号)に1、第2引数(現要素番号)に1、第3引数(現X座標)に変数x、第4引数(現Y座標)に変数yをセットする。
【0098】
サブルーチン「要素配置処理」では、最初に、引数で渡される現在の要素をマス目に配置する処理(ステップS12とステップS13)を行った後に次の要素の処理へ進む。最後に、引数で渡された現在の要素のマス目とそれ下位のレベルの配置をクリアする(ステップS21)。
以下、図18のフローチャートに沿って説明する。
【0099】
まず、ステップS11で、引数をサブルーチン内部変数に取り込む。
【0100】
ステップS12で、各要素のマス目への配置位置を保存する変数17(図14.X座標はWX、Y座標はWY、第1添字は現グループ番号、第2添字は現要素番号)に現X座標と現Y座標をセットする。
【0101】
ステップS13で、サブルーチン「マス目レベル値設定処理」を呼ぶ。その際、第1引数(グループ番号)に現グループ番号、第2引数(要素番号)に現要素番号、第3引数(X座標)に現X座標、第4引数(Y座標)に現Y座標をセットする。
【0102】
ステップS14で、第2引数の現要素番号に1を加算して次要素番号を算出し次の要素の処理へ進む。次のステップS15で、この次要素番号がその属するグループの最大要素番号を超えたかどうかを判定し、超えない場合、すなわち次要素番号が存在する場合はステップS16、超える場合、すなわち次要素番号が存在しない場合はステップS17を処理する。
【0103】
ステップS16で、サブルーチン「次要素処理」を呼ぶ。その際、第1引数(グループ番号)に現グループ番号、第2引数(要素番号)にステップS14で算出した次要素番号、第3引数(X座標)に現X座標、第4引数(Y座標)に現Y座標をセットする。その処理後ステップS21へ行く。
【0104】
ステップS17で、第1引数の現グループ番号に1を加算した値を次グループ番号とする。次のステップS18で、この次グループ番号がメモリ02(図14)のグループ数13を超えたかどうかを判定し、超えない場合、すなわち次グループ番号が存在する場合はステップS19、超える場合、すなわち次グループ番号が存在しない場合はステップS20の出力処理を実行し、その処理後ステップS21へ行く。
【0105】
ステップS19で、サブルーチン「次グループ処理」(図25)を呼ぶ。その際、引数(グループ番号)に次グループ番号をセットする。
【0106】
ステップS20で、メモリ02(図14)に保存されているデータを配置組み合わせ(各マス目の配置要素)レコードとして外部メモリ01に出力する。出力項目は図6のとおり。
【0107】
・ PIDはレコード出力ごとに1からの連番を出力する。
【0108】
・ PTYPE(パターン分類)は図3から図5に示されているように、マス目の列数と行数、各グループの要素数を連結した文字列を出力する。
【0109】
・ A1からD4までの各マス目に置く要素を示す記号(16項目)は、以下の(1)から(4)のように、メモリ02(図14)の各要素のマス目への配置位置17のWXとWYの内容を順次調べて、該当するマス目の位置のグループ記号(第1グループはP、第2グループはQ、第3グループはR、第4グループはS、第5グループはT)と要素番号(1〜15)を連結した文字列を出力する。なおこの実施例ではA1からD4の16項目だが、例えば、マス目が3列2行の場合はA1、A2、B1、B2、C1、C2の6項目になる。
(1) 列数変数xを1からマス目の列数まで、行数変数yを1からマス目の行数まで順に設定したうえで以下の比較処理を行う。
(2) 第1グループの第1要素のWX(1,1)とWY(1,1)がxとyに一致すれば、P1を出力し、当比較処理を出る。これは、重なりがある場合は最初の重なり順序の要素を出力することを意味する。
(3) 次に、第1グループの第2要素のWX(1,2)とWY(1,2)がxとyに一致すれば、P2を出力し、当比較処理を出る。この処理を第1グループの要素数だけ繰り返す。
(4) 第2グループ以降についても、(2)、(3)と同様の処理を行う。
【0110】
・ DUPPOS1、DUPU1、DUPD1からDUPPOS6、DUPU6、DUPD6までの6組の重なりデータは、以下の(1)から(9)のようにメモリ02(図14)のマス目重なり要素レベル値16を順次読んで出力する。
(1) 列数変数xを1からマス目の列数まで、行数変数yを1からマス目の行数まで順に設定したうえで以下の処理を行う。なおNは初期値を1とし、出力するごとに1を加算する。
(2) LV(5,x,y)が0以外ならば、LV(1,x,y)とLV(2,x,y)から1組、LV(1,x,y)とLV(3,x,y)から1組、LV(1,x,y)とLV(4,x,y)から1組、LV(1,x,y)とLV(5,x,y)から1組の合計4組の重なりデータを作成する。これは1つのマス目に5つの要素が重なっている例である。
(3) LV(4,x,y)が0以外ならば、LV(1,x,y)とLV(2,x,y)から1組、LV(1,x,y)とLV(3,x,y)から1組、LV(1,x,y)とLV(4,x,y)から1組の合計3組の重なりデータを作成する。これは1つのマス目に4つの要素が重なっている例である。
(4) LV(3,x,y)が0以外ならば、LV(1,x,y)とLV(2,x,y)から1組、LV(1,x,y)とLV(3,x,y)から1組の合計2組の重なりデータを作成する。これは1つのマス目に3つの要素が重なっている例である。
(5) LV(2,x,y)が0以外ならば、LV(1,x,y)とLV(2,x,y)から1組の重なりデータを作成する。これは1つのマス目に2つの要素が重なっている例である。
(6) 1組の重なりデータは、重なり順序の小さいLV(L,x,y)と重なり順序の大きいLV(H,x,y)から以下のように作成する。
(7) まず、x座標とy座標より、xの1〜4を列を表す文字ABCDに置き換え、yと連結した2文字をDUPPOSNにセットする。
(8) 次に、LV(L,x,y)の100の位の1〜5をグループ番号を表す文字PQRSTに置き換え、10の位と1の位の要素番号を表す文字と連結した3文字をDUPUNにセットする。
(9) 次に、LV(H,x,y)の100の位の1〜5をグループ番号を表す文字PQRSTに置き換え、10の位と1の位の要素番号を表す文字と連結した3文字をDUPDNにセットする。
【0111】
ステップS20では同時に、メモリ02に保存されているデータを配置組み合わせ(各要素のマス目位置)レコードとしても外部メモリ01に出力する。出力項目は図7のとおり。
【0112】
・ PIDはレコード出力ごとに1からの連番を出力する。これは、上記の各マス目の配置要素レコードのPIDと一致する。
【0113】
・ PTYPE(パターン分類)は上記の各マス目の配置要素レコードのPTYPEと一致する。
【0114】
・ 第1グループの各要素のマス目の位置(P1〜P7)の7項目は、メモリ02(図14)の各要素のマス目への配置位置17のWX(1,1)からWX(1,7)とWY(1,1)からWY(1,7)の内容をマス目位置記号(A1〜D4)に変換して順次出力する。
【0115】
・ 第2グループの各要素のマス目の位置(Q1〜Q7)の5項目は、メモリ02(図14)の各要素のマス目への配置位置17のWX(2,1)からWX(2,5)とWY(2,1)からWY(2,5)の内容をマス目位置記号(A1〜D4)に変換して順次出力する。
【0116】
・ 第3グループの各要素のマス目の位置(R1〜R7)の5項目は、メモリ02(図14)の各要素のマス目への配置位置17のWX(3,1)からWX(3,5)とWY(3,1)からWY(3,5)の内容をマス目位置記号(A1〜D4)に変換して順次出力する。
【0117】
・ DUPPOS1、DUPU1、DUPD1はメモリ02(図14)の重なり要素レベル値16を順次読んで出力する。これは、上記の各マス目の配置要素レコードのDUPPOS1、DUPU1、DUPD1と一致する。
【0118】
ステップS21で、現グループ番号に100を掛けた値に現要素番号を加えた値を引数(レベル値)にセットし、サブルーチン「マス目レベル値クリア処理」を呼ぶ。この処理までに引数で渡される現在の要素に対する処理は完了しているので、この処理により現在の要素のマス目とその下位レベルの要素への配置をすべてクリアする。
【0119】
当サブルーチン処理を終了し、元の処理に戻る。
【0120】
サブルーチン「マス目レベル値設定処理」では、各マス目にどの要素が配置されたかを記憶する。グループ数が5の場合、1つのマス目に最大5つまで重ねて配置されるので、メモリ02(図14)のLV配列変数では、第1添字で重なり順位を指定する。
以下、図19のフローチャートに沿って説明する。
【0121】
まず、ステップS31で、引数をサブルーチン内部変数に取り込む。
【0122】
ステップS32で、マス目に1つ目の要素がすでに配置されているかをチェックし、配置されていない場合、すなわち、LV(1、現X座標、現Y座標)が0の場合は、ステップS33で、現グループ番号に100を掛けた値に現要素番号を加えた値をLV(1、現X座標、現Y座標)にセットし、当サブルーチン処理を終了し、元の処理に戻る。
【0123】
すでにマス目の1つ目の要素が配置されている場合は、ステップS34で、マス目に2つ目の要素がすでに配置されているかをチェックし、配置されていない場合、すなわち、LV(2、現X座標、現Y座標)が0の場合は、ステップS35で、現グループ番号に100を掛けた値に現要素番号を加えた値をLV(2、現X座標、現Y座標)にセットし、当サブルーチン処理を終了し、元の処理に戻る。
【0124】
すでにマス目の2つ目の要素も配置されている場合は、ステップS36で、マス目に3つ目の要素がすでに配置されているかをチェックし、配置されていない場合、すなわち、LV(3、現X座標、現Y座標)が0の場合は、ステップS37で、現グループ番号に100を掛けた値に現要素番号を加えた値をLV(3、現X座標、現Y座標)にセットし、当サブルーチン処理を終了し、元の処理に戻る。
【0125】
すでにマス目の3つ目の要素も配置されている場合は、ステップS38で、マス目に4つ目の要素がすでに配置されているかをチェックし、配置されていない場合、すなわち、LV(4、現X座標、現Y座標)が0の場合は、ステップS39で、現グループ番号に100を掛けた値に現要素番号を加えた値をLV(4、現X座標、現Y座標)にセットし、当サブルーチン処理を終了し、元の処理に戻る。
【0126】
すでにマス目の4つ目の要素も配置されている場合は、ステップS40で、マス目に5つ目の要素がすでに配置されているかをチェックし、配置されていない場合、すなわち、LV(5、現X座標、現Y座標)が0の場合は、ステップS41で、現グループ番号に100を掛けた値に現要素番号を加えた値をLV(5、現X座標、現Y座標)にセットし、当サブルーチン処理を終了し、元の処理に戻る。
【0127】
すでにマス目の5つ目の要素も配置されている場合は、エラー処理(エラーメッセージ出力等)を行った上で処理を中止する。
【0128】
サブルーチン「次要素処理」では、現在の要素の位置を基点にして、上、下、右、左隣のマス目を次の要素の位置として配置処理を行う。すなわち、第2要素以降の従属要素(直前のマス目の上下左右のマス目にしか置けない要素)の配置処理である。
以下、図20のフローチャートに沿って説明する。
【0129】
まず、ステップS51で、引数をサブルーチン内部変数に取り込む。
【0130】
ステップS52で、サブルーチン「次要素配置処理」を呼ぶ。その際、第1引数(方向)に「上」、第2引数(グループ番号)に現グループ番号、第3引数(要素番号)に次要素番号、第4引数(X座標)に現X座標、第5引数(Y座標)に現Y座標をセットする。
【0131】
ステップS53で、サブルーチン「次要素配置処理」を呼ぶ。その際、第1引数(方向)に「下」、第2引数(グループ番号)に現グループ番号、第3引数(要素番号)に次要素番号、第4引数(X座標)に現X座標、第5引数(Y座標)に現Y座標をセットする。
【0132】
ステップS54で、サブルーチン「次要素配置処理」を呼ぶ。その際、第1引数(方向)に「右」、第2引数(グループ番号)に現グループ番号、第3引数(要素番号)に次要素番号、第4引数(X座標)に現X座標、第5引数(Y座標)に現Y座標をセットする。
【0133】
ステップS55で、サブルーチン「次要素配置処理」を呼ぶ。その際、第1引数(方向)に「左」、第2引数(グループ番号)に現グループ番号、第3引数(要素番号)に次要素番号、第4引数(X座標)に現X座標、第5引数(Y座標)に現Y座標をセットする。
【0134】
当サブルーチン処理を終了し、元の処理に戻る。
【0135】
サブルーチン「次要素配置処理」では、引数で指定された方向のマス目に配置可能かをチェックし、配置可能ならサブルーチン「要素配置処理」を呼ぶ。なお、このサブルーチンは配置組み合わせ出力部メイン処理のステップS6で呼ばれたサブルーチンと同一で再帰関数となっている。
以下、図21のフローチャートに沿って説明する。
【0136】
まず、ステップS61で、引数をサブルーチン内部変数に取り込む。
【0137】
ステップS62で、引数の方向を判定し、「上」ならばステップS63で現Y座標に1を減算した値を次Y座標に、現X座標を次X座標にセットし、ステップS69へ行く。
【0138】
ステップS64で、引数の方向を判定し、「下」ならばステップS65で現Y座標に1を加算した値を次Y座標に、現X座標を次X座標にセットし、ステップS69へ行く。
【0139】
ステップS66で、引数の方向を判定し、「右」ならばステップS67で現X座標に1を加算した値を次X座標に、現Y座標を次Y座標にセットし、ステップS69へ行く。
【0140】
引数の方向が「上」、「下」、「右」のいずれでもない場合はステップS68で現X座標に1を減算した値を次X座標に、現Y座標を次Y座標にセットし、ステップS69へ行く。
【0141】
ステップS69で、サブルーチン「次要素チェック処理」を呼ぶ。その際、第1引数(グループ番号)に現グループ番号、第2引数(要素番号)に現要素番号、第3引数(X座標)に次X座標、第4引数(Y座標)に次Y座標をセットする。
【0142】
ステップS70で,ステップS69で、サブルーチン「次要素チェック処理」の戻り値(チェックOK又はチェックNG)を判定し、チェックOKなら、ステップS71でサブルーチン「要素配置処理」を呼ぶ。
【0143】
当サブルーチン処理を終了し、元の処理に戻る。
【0144】
サブルーチン「次要素チェック処理」では、引数で指定された座標のマス目に配置可能かをチェックし、配置可能なら戻り値をチェックOKとし、配置不可なら戻り値をチェックNGとする。
以下、図22のフローチャートに沿って説明する。
【0145】
まず、ステップS81で、引数をサブルーチン内部変数に取り込む。
【0146】
ステップS82で、次X座標が1からマス目の列数までの範囲内にあるかどうかをチェックし、範囲外であれば、戻り値にチェックNGをセットして、当サブルーチン処理を終了し、元の処理に戻る。
【0147】
ステップS83で、次Y座標が1からマス目の行数までの範囲内にあるかどうかをチェックし、範囲外であれば、戻り値にチェックNGをセットして、当サブルーチン処理を終了し、元の処理に戻る。
【0148】
ステップS84で、次X座標と次Y座標が指し示すマス目に、引数の現グループ番号と同じグループの要素がすでに置かれているかどうかを、メモリ02(図14)の配列変数LV(1,次X座標,次Y座標)、LV(2,次X座標,次Y座標)、LV(3,次X座標,次Y座標)、LV(4,次X座標,次Y座標)、LV(5,次X座標,次Y座標)のレベル値の100の位を現グループ番号と比較し、同じグループの要素がすでに置かれている場合は戻り値にチェックNGをセットして、当サブルーチン処理を終了し、元の処理に戻る。
【0149】
ステップS86で、サブルーチン「重なり配置可能チェック」を呼ぶ。その際、第1引数(X座標)に次X座標、第2引数(Y座標)に次Y座標をセットする。その結果により、重なり可能であれば戻り値にチェックOKを、重なり不可であれば戻り値にチェックNGをセットして、当サブルーチン処理を終了し、元の処理に戻る。
【0150】
サブルーチン「重なり配置可能チェック」では、引数で指定された座標のマス目に重なり配置が可能かどうかをチェックし、配置可能なら戻り値をチェックOKとし、配置不可なら戻り値をチェックNGとする。
以下、図23のフローチャートに沿って説明する。
【0151】
まず、ステップS91で、引数をサブルーチン内部変数に取り込む。
【0152】
ステップS92で、引数で指定されたマス目1箇所だけで、重なり数を超えてしまうかどうかをチェックする。
すなわち、重なり数がN(N=0〜4)の場合、すでにLV(N+1,X座標,Y座標)が0以外であれば、チェックNGとして当サブルーチン処理を終了し、元の処理に戻る。
【0153】
ステップS93では、重なり数が1以上の場合に以下のチェックを行う。最初に引数で指定されたマス目について現時点の重なり数に1をプラスした値を算出する。次に、引数で指定されたマス目を除くすべてのマス目において現時点の重なり数を合計した値を算出する。そして、両者を合わせた値が重なり数を超えるかどうかをチェックする。超えた場合はチェックNG、超えない場合はチェックOKとして当サブルーチン処理を終了し、元の処理に戻る。
この算出では、座標(x,y)のマス目の重なり数は、LV(5,x,y)が0以外なら4、LV(4,x,y)が0以外なら3、LV(3,x,y)が0以外なら2、LV(2,x,y)が0以外なら1とカウントする。
【0154】
サブルーチン「マス目レベル値クリア処理」は、メモリ02(図14)の第1重なり要素レベル値から第5重なり要素レベル値が引数で指定されたレベル値と同じ又は大きい値の場合にゼロクリアする。これは指定した要素とその下位レベルの要素のマス目への配置をクリアする処理である。
以下、図24のフローチャートに沿って説明する。
【0155】
ステップS101で、ループ処理で使用するマス目のX座標(列番号)変数xとY座標(行番号)変数yを1に初期化し、ステップS109とステップS110で変数xと変数yに1を加算しながら、ステップS102とステップS103で変数xと変数yの上限チェックを行い、ステップS104からステップS108の処理を繰り返す。
【0156】
ステップS104で、LV(1,x,y)が引数のレベル値以上ならゼロクリアする。
【0157】
ステップS105で、LV(2,x,y)が引数のレベル値以上ならゼロクリアする。
【0158】
ステップS106で、LV(3,x,y)が引数のレベル値以上ならゼロクリアする。
【0159】
ステップS107で、LV(4,x,y)が引数のレベル値以上ならゼロクリアする。
【0160】
ステップS108で、LV(5,x,y)が引数のレベル値以上ならゼロクリアする。
【0161】
当サブルーチン処理を終了し、元の処理に戻る。
【0162】
処理が終了すると、算出されたすべての組み合わせパターンの各マス目の配置要素レコード(レイアウトは図6を参照)と各要素のマス目位置レコード(レイアウトは図7を参照)が外部メモリに出力される。
【0163】
サブルーチン「次グループ処理」は、第2グループ以降の第1要素(独立要素)を配置する処理である。
以下、図25のフローチャートに沿って説明する。
【0164】
ステップS111で、引数の次グループ番号を内部変数に取り込む。
【0165】
ステップS112で、ループ処理で使用するマス目のX座標(列番号)変数xとY座標(行番号)変数yを1に初期化し、ステップS118とステップS119で変数xと変数yに1を加算しながら、ステップS113とステップS114で変数xと変数yの上限チェックを行い、ステップS115からステップS117の処理を繰り返す。
【0166】
ステップS115で、サブルーチン「重なり配置可能チェック」を呼ぶ。その際、第1引数(X座標)にX座標(列番号)変数x、第2引数(Y座標)にY座標(行番号)変数yをセットする。その結果により、配置可能であればステップS117へ、配置不可であればステップS118へ行く。
【0167】
サブルーチン「重なり配置可能チェック」では、引数で指定された座標のマス目に重なり配置が可能かどうかをチェックし、配置可能なら戻り値をチェックOKとし、配置不可なら戻り値をチェックNGとする。
【0168】
ステップS117で、サブルーチン「要素配置処理」を呼ぶ。その際、第1引数(現グループ番号)に次グループ番号、第2引数(現要素番号)に1、第3引数(現X座標)に変数x、第4引数(現Y座標)に変数yをセットする。
【0169】
次に、唯一解出力部プログラムをメモリ02にロードして起動させる。起動すると、ディズプレイ03に唯一解出力部画面(図16)が表示される。
【0170】
キーボード04から画面に表示されたパターン分類30と重なり要素関係分類31を選択し、唯一解算出の各種制約条件の優先順位32(1〜9、1が最高優先、9が最低優先)を入力し、処理実行ボタン34を押下してプログラムを起動する。処理が終了すると、算出された唯一解のレコード(レイアウトは図8を参照)が外部メモリ01に出力される。
【0171】
「各種制約条件の優先順位」は以下の9種類から指定できる。
各グループ第3要素以降はこの実施例では対象外としている。
・ 各グループ第1要素配置場所指定
・ 各グループ第2要素配置場所指定
・ 各グループ最終要素配置場所指定
・ 第1重なり配置場所指定
・ 第2重なり配置場所指定
・ 第3重なり配置場所指定
・ 第4重なり配置場所指定
・ 第5重なり配置場所指定
・ 第6重なり配置場所指定
【0172】
ここでは、制約条件の優先順位は次のとおりとする。
・ 各グループ第1要素位置指定・・優先順位第1位
・ 第1重なり配置場所指定 ・・優先順位第2位
・ 各グループ第2要素位置指定・・優先順位第3位
・ 各グループ最終要素位置指定・・優先順位第4位
【0173】
すなわち、まず、各グループ第1要素位置指定で唯一解の有無を調べ、唯一解がなければ、各グループ第1要素位置指定に加えて、第1重なり配置場所指定で唯一解の有無を調べ、唯一解がなければ、更に各グループ第2要素位置指定を制約条件に加えて唯一解の有無を調べる。以上のように順に制約条件を追加しながら唯一解が見つかるまで繰り返す。
【0174】
なお、マス目の列数と行数、各グループの要素数、唯一解算出条件の各種制約条件の優先順位を固定でセットするか、テキストファイルの読み込みでセットすることも可能だが、ここでは画面から変更可能とした実施例で説明する。
【0175】
以下、図26のフローチャートに沿って、CPU05で実行されるプログラムの流れを説明する。
ステップS120で、キーボード04から入力されたパターン分類30と重なり要素関係分類31、また唯一解算出条件の各種制約条件の処理優先順位を取得する。
【0176】
ステップS121で、制約条件の優先順位に従って、各種制約条件の処理に未処理があるかどうかを判定し、未処理が無い場合は処理を終了する。
【0177】
ステップS122で、組み合わせパターンのレコードからステップS120で読み込んだパターン分類と要素関係分類に一致するレコードのみを抽出する命令文を組み立てる。
ここでは、重なり数が1の実施例で説明する。
【0178】
例えば、パターン分類(PTYPE)として44755、重なり要素関係分類(DUPTYPE)としてP4R5(第1グループの第4要素と第3グループの第5要素が重なる関係)が選択された場合は、配置組み合わせ(各要素のマス目位置)レコード(図7)のPTYPE(パターン分類番号)が44755、DUPU1(重なり要素の上位の要素を示す記号)がP4、DUPD1(重なり要素の下位の要素を示す記号)がR5のデータを抽出する。
【0179】
ステップS123で、ステップS122で作成した抽出レコード(上記例では992件)に対し、各種制約条件の第1優先順位である各グループ第1要素位置の3つの要素(P1、Q1、R1)を集計キーとして集計レコードを作成して、集計キーごとに抽出レコードを何件ずつ集計したのかを調べる。例えば、P1(第1グループの第1要素)をA1のマス目、Q1(第2グループの第1要素)をA2のマス目、R1(第3グループの第1要素)をA3のマス目に配置する場合の集計件数は2件になるので唯一解にはならない。
【0180】
しかし、P1をA4のマス目、Q1をC3のマス目、R1をB2のマス目に配置する場合の集計件数は1件となるので唯一解になる。
【0181】
また、P1をC3のマス目、Q1をA4のマス目、R1をB3のマス目に配置する場合の集計件数も1件となるので唯一解になる。図1はこの唯一解の応用例である。
【0182】
以上のようにすべての集計キーごとに唯一解になるかどうかを調べる。この例のように、各グループ第1要素位置指定のみで唯一解が見つかった場合は、その内容を出力して処理を終了することになる。すなわち優先順位第2位以下の条件追加は必要ないことになる。
【0183】
唯一解が存在しない場合は更に次の優先順位の「第1重なり配置場所指定」を条件に追加し、ステップS122で作成した抽出レコードに対し、P1、Q1、R1、DUPPOS1(第1重なり配置場所)を集計キーとして集計レコードを作成して、集計キーごとの集計レコードの集計件数が1(唯一解)になるかどうかをチェックする。
【0184】
唯一解が存在しない場合は更に次の優先順位である「各グループ第2要素位置指定」を条件に追加し、ステップS122で作成した抽出レコードに対し、P1、P2、Q1、Q2、R1、R2,DUPPOS1を集計キーとして集計レコードを作成して、集計キーごとの集計レコードの集計件数が1(唯一解)になるかどうかをチェックする。
【0185】
ステップS124で、唯一解が存在した場合は次の出力処置を実行し、存在しない場合は次の優先順位の条件による処理へ行く。
【0186】
ステップS125で、唯一解のレコード(レイアウトは図8を参照)を外部メモリ01に出力し処理を終了する。
・ IDはレコード出力ごとに1からの連番を出力する。
・ PIDは配置組み合わせレコードのレコード識別番号をそのまま出力する。
・ PTYPEは配置組み合わせレコードのパターン分類番号をそのまま出力する。
・ DUPTYPEはステップS1で入力された重なり要素関係分類。
【0187】
次に、一段階方式について説明する。
以下、図31以降のフローチャートに沿ってプログラムの流れを説明する。
【0188】
ステップS130で、キーボード04から入力された一段階方式唯一解算出画面(その1は図28、その2は図29。両者は切り替えボタン49で切り替え可能)のマス目の列数40、行数41、グループ数42、各グループの要素数43、制約条件(グループ要素単位)47又は制約条件(マス目単位)48をメモリ02(図30)の対応する変数領域(列数は50、行数は51、グループ数は52、重なり要素数53、各グループの要素数は54、制約条件はステップS131に詳述)にセットする。
【0189】
ステップS131で、上記ステップで読み込んだ制約条件としての初期配置を配列変数LVI(L,X,Y)に保存する。Lは重なり順位、Xは重なり位置の列座標、Yは重なり位置の行座標で、グループ番号に100を掛けた値に要素番号を加算した値をセットし、初期値(未設定)は0とする。例えばC列2行(列座標:3、行座標:2)のマス目に第3グループ第3要素と第5グループ第2要素が初期設定される場合は、LVI(1,3,2)に303、LVI(2,3,2)に502をセットする。
【0190】
上記のように1つのマス目に2つの要素が重なる場合は、配列変数LVI(L,X,Y)のLは、グループ番号の昇順に、最初の要素ではL=1、次の要素ではL=2となる。
【0191】
また、制約条件としての初期配置を配列変数WXI(G,E)、WYI(G,E)に保存する。Gはグループ番号、Eは要素番号で、WXIには列座標、WYIには行座標をセットし、初期値(未設定)は0とする。例えばC列2行(列座標:3、行座標:2)のマス目に第3グループ第3要素と第5グループ第2要素が初期設定される場合は、WXI(3、3)に3、WYI(3、3)に2をセットするとともに、WXI(5、2)に3、WYI(5、2)に2をセットする。
【0192】
一段階方式唯一解算出画面その1(図28)とその2(図29)の違いは、前者は初期配置するグループ、要素のマス目位置を指定するのに対し、後者は初期配置するマス目のグループ、要素を指定する点で、両者は裏表の関係になる。なお、1つのマス目に2つの要素を初期配置する場合、後者においてはグループ番号の小さい要素を上段に、大きい要素を下段に設定することとする。この実施例の画面では初期配置の段階で1つのマス目に3つ以上の要素を重ねる場合には対応していない。
【0193】
ステップS132で、ループ処理で使用するマス目のX座標(列番号)変数xとY座標(行番号)変数yを1に初期化し、ステップS139とステップS141で変数xと変数yに1を加算しながら、ステップS133とステップS134で変数xと変数yの上限チェックを行う。その間、ステップS135からステップS138の処理を繰り返す。
【0194】
ただし、ステップS140で、第1グループ第1要素の初期配置が設定されている場合はループ処理を行わずに処理を終了する。
【0195】
ステップS131で、初期配置処理サブルーチン(図32)を呼ぶ。このサブルーチンでは、一段階方式唯一解算出画面その1(図28)とその2(図29)の制約条件からメモリ02(図30)の初期配置重なり要素レベル値56と各要素のマス目への初期配置位置58を設定する。
【0196】
ステップS135で、初期配置重なり要素レベル値56の全配列要素を重なり要素レベル値55にコピーする。また、各要素のマス目への初期配置位置58の全配列要素を各要素のマス目への配置位置57にコピーする。
【0197】
ステップS136で、第1グループ第1要素の初期配置設定値WXI(1,1)が0、すなわち未設定ならばステップS138へ行き、通常のループ処理を行う。設定済ならばステップS137を実行し、第1グループ第1要素の初期配置設定値WXI(1,1)をxに、WYI(1,1)をyにセットする。また、この場合は、ステップS140で処理を終了し、ループ処理は行わない。
【0198】
ステップS138で、サブルーチン「要素配置処理」(図33)を呼ぶ。その際、第1引数(現グループ番号)に1、第2引数(現要素番号)に1、第3引数(現X座標)に変数x、第4引数(現Y座標)に変数yをセットする。
【0199】
サブルーチン「要素配置処理」では、最初に、引数で渡される現在の要素をマス目に配置する処理(ステップS161の各要素のマス目への配置位置保存とステップS162の重なり要素レベル値設定)を行うとともに、次の要素の処理へつなげる。最後に、ステップS166で、マス目レベル値クリア処理を実行する。これは引数で指定したレベル値以下、すなわち現要素とその下位レベルの要素のマス目への配置をクリアする処理である。
以下、図33のフローチャートに沿って説明する。
【0200】
まず、ステップS160で、引数をサブルーチン内部変数に取り込む。
【0201】
ステップS161で、各要素のマス目への配置位置を保存する変数57(図30。X座標はWX、Y座標はWY、第1添字はグループ番号、第2添字は要素番号)に現X座標と現Y座標をセットする。
【0202】
ステップS162で、サブルーチン「マス目レベル値設定処理」(図19)を呼ぶ。その際、第1引数(グループ番号)に現グループ番号、第2引数(要素番号)に現要素番号、第3引数(X座標)に現X座標、第4引数(Y座標)に現Y座標をセットする。
【0203】
ステップS163で、第2引数の現要素番号に1を加算して次要素番号を算出する。次のステップS164で、この次要素番号がその属するグループの最大要素番号を超えたかどうかを判定し、超えない場合、すなわち次要素番号が存在する場合はステップS165、超える場合、すなわち次要素番号が存在しない場合はステップS167を処理する。
【0204】
ステップS165で、サブルーチン「次要素処理」(図34)を呼ぶ。その際、第1引数(グループ番号)に現グループ番号、第2引数(要素番号)に次要素番号、第3引数(X座標)に現X座標、第4引数(Y座標)に現Y座標をセットする。その処理後ステップS166へ行く。
【0205】
ステップS167で、第1引数の現グループ番号に1を加算した値を次グループ番号とする。次のステップS168で、この次グループ番号がメモリ02(図30)のグループ数52を超えたかどうかを判定し、超えない場合、すなわち次グループ番号が存在する場合はステップS169、超える場合、すなわち次グループ番号が存在しない場合はステップS170の出力処理を実行し、ステップS171で出力件数を1加算する。
【0206】
ステップS172で、出力件数が1を超えたかどうかを判定し、1を越えた場合はステップS173で画面(画面28又は画面29)に「唯一解ではありません」というメッセージを出力後、処理を終了する。
【0207】
1を超えない場合は、画面(画面28又は画面29)の件数欄46に「1」を出力し、ステップS166へ行く。
【0208】
ステップS169で、サブルーチン「次グループ処理」(図35)を呼ぶ。その際、引数(グループ番号)に次グループ番号をセットする。
【0209】
ステップS170で、メモリ02に保存されている組み合わせデータを唯一解レコードとして外部メモリ01に出力する。出力項目は図36のとおり。
・ IDはこのレコードの連番である。
・ このレイアウトのP1以降は、グループ数が5で、各グループの要素数が7−7−7−5−5の場合の各マス目の位置を示す文字列(A1、A2・・F5等)を保存する項目である。
・ P1以降のマス目の位置が初期配置する場合は、マス目の位置を示す文字列の末尾に*(アスタリスク)を付加する。
【0210】
サブルーチン「次要素処理」(一段階方式)では、引数で渡された現在の要素の位置を基点にして、上、下、右、左のマス目を次の要素の位置として配置処理を行う。又は、次要素が初期配置済の場合は次要素の配置処理を行う。
以下、図34のフローチャートに沿って説明する。
【0211】
まず、ステップS180で、引数をサブルーチン内部変数に取り込む。
【0212】
ステップS181で、次要素が初期配置されているかどうかを判定し、設定済の場合はステップS186へ行き、未設定の場合は、ステップS182へ行く。なお、初期配置における同一グループ内の要素は必ず上下左右に隣り合って配置されているものとする。
【0213】
例えば、図29のようにT1とT2はそれぞれD列2行、C列2行に配置され、左右に隣り合って配置されている。従って、このサブルーチンでは、初期配置がなければ、T2の配置位置はD列1行、D列3行、E列2行、C列2行の4つになるが、初期配置がある場合は残りの3つの配置は対象外になる。以下、ステップS182からS185は初期配置がない場合に実行する。
【0214】
ステップS182で、サブルーチン「次要素配置処理」を呼ぶ。その際、第1引数(方向)に「上」、第2引数(グループ番号)に現グループ番号、第3引数(要素番号)に次要素番号、第4引数(X座標)に現X座標、第5引数(Y座標)に現Y座標をセットする。
【0215】
ステップS183で、サブルーチン「次要素配置処理」を呼ぶ。その際、第1引数(方向)に「下」、第2引数(グループ番号)に現グループ番号、第3引数(要素番号)に次要素番号、第4引数(X座標)に現X座標、第5引数(Y座標)に現Y座標をセットする。
【0216】
ステップS184で、サブルーチン「次要素配置処理」を呼ぶ。その際、第1引数(方向)に「右」、第2引数(グループ番号)に現グループ番号、第3引数(要素番号)に次要素番号、第4引数(X座標)に現X座標、第5引数(Y座標)に現Y座標をセットする。
【0217】
ステップS185で、サブルーチン「次要素配置処理」を呼ぶ。その際、第1引数(方向)に「左」、第2引数(グループ番号)に現グループ番号、第3引数(要素番号)に次要素番号、第4引数(X座標)に現X座標、第5引数(Y座標)に現Y座標をセットする。
【0218】
ステップS182からステップS185までの処理が終了したらサブルーチンから元の処理に戻る。
【0219】
ステップS186は制約条件としての初期配置がある場合の処理である。ここでは、メモリ02(図30)の各要素のマス目への処理配置位置58から、次要素の初期配置座標を読み取り、次X座標、次Y座標とする。
【0220】
ステップS187で、サブルーチン「要素配置処理」(図33)を呼ぶ。その際、第1引数(現グループ番号)に現グループ番号、第2引数(現要素番号)に次要素番号、第3引数(現X座標)に次X座標、第4引数(現Y座標)に次Y座標をセットする。
【0221】
当サブルーチン処理を終了し、元の処理に戻る。
【0222】
サブルーチン「次グループ処理」(一段階方式)は、第2グループ以降の各グループの第1要素を配置する処理である。
以下、図35のフローチャートに沿って説明する。
【0223】
ステップS190で、引数の次グループ番号をサブルーチン内部変数gに取り込む。
【0224】
ステップS191で、ループ処理で使用するマス目のX座標(列番号)変数xとY座標(行番号)変数yを1に初期化し、ステップS199とステップS201で変数xと変数yに1を加算しながら、ステップS192とステップS193で変数xと変数yの上限チェックを行い、ステップS194からステップS198の処理を繰り返す。
【0225】
ステップS194で、第gグループ第1要素の初期配置設定値WXI(g,1)が0、すなわち未設定ならばS196へ行き、通常のループ処理を行う。設定済ならばステップS195を実行し、第gグループ第1要素の初期配置設定値WXI(g,1)をxに、WYI(g,1)をyにセットする。また、この場合は、ステップS200で処理を終了し、ループ処理は行わない。
【0226】
ステップS196で、サブルーチン「重なり配置可能チェック」を呼ぶ。その際、第1引数(X座標)にX座標(列番号)変数x、第2引数(Y座標)にY座標(行番号)変数yをセットする。その結果により、配置可能であればステップS198の要素配置処理を実行し、配置不可であればステップS199へ行く。
【0227】
サブルーチン「重なり配置可能チェック」では、引数で指定された座標のマス目に重なり配置が可能かどうかをチェックし、配置可能なら戻り値をチェックOKとし、配置不可なら戻り値をチェックNGとする。
【0228】
ステップS198で、サブルーチン「要素配置処理」を呼ぶ。その際、第1引数(現グループ番号)に次グループ番号、第2引数(現要素番号)に1、第3引数(現X座標)に変数x、第4引数(現Y座標)に変数yをセットする。
【0229】
以下に、隣接定義がされている要素配置場所が配された平面を使った実施例2を説明する。図37(a)のような、複数の要素配置場所があって、各要素配置場所がどの要素配置場所と隣接するかが、現実の地理区域や線路・航路に基づいてあらかじめ定義されている平面と、以下のような複数の旅程が提示され、唯一の配置法を見つけるパズルである。
(1) 佐渡金山−善光寺−山中湖−寸又峡
(2) 一乗谷−兼六園−白川郷
(3) 黒部ダム−長良川鵜飼−犬山城
【0230】
上記観光地を所在地都道府県に置き換えると次のようになる。
(1) 新潟−長野−山梨−静岡
(2) 福井−石川−岐阜
(3) 富山−岐阜−愛知
【0231】
この3つの旅程は次の3つのグループの要素に対応する。グループの順番は要素数の降順とする。
(1) P1−P2−P3−P4(第1グループの4つの要素)
(2) Q1−Q2−Q3(第2グループの3つの要素)
(3) R1−R2−R3(第3グループの3つの要素)
【0232】
以上のグループ要素が図37(a)のような要素配置場所に配置する方法はただ一通り かの判定を行う装置について、図42以降のフローチャートに沿って説明する。
【0233】
ステップS210で、隣接定義方式唯一解判定画面(図39)の配置場所数60、グループ数61、各グループの要素数62、初期配置設定63、配置場所間隣接定義64をメモリ02(図40)の対応する変数領域(配置場所数70、グループ数71、各グループの要素数72、その他)にセットする。その他については下記で詳述する。
【0234】
入力されたグループの要素数の合計値から配置場所数を減算した値をメモリ02(図40)の重なり要素数73にセットするとともに、画面(図39)の重なり要素数66にセットする。この実施例では、第1グループ要素数が4、第2グループ要素数が3、第3グループ要素数が3で、配置場所数が9になるので、重なり要素数は1となる。
【0235】
また、配置場所間隣接定義64をメモリ02(図40)の隣接定義77、すなわちC(X)に保存する。添え字のXは配置場所を表す数字(実施例では1〜9)であり、以下のように各配置場所との隣接有無を5桁単位の0又は1でセットする。
【0236】
例えば、図38(a)の場合は以下のように表す。各要素配置場所(X1〜X9)の他要素配置場所(X1〜X9)との隣接定義を0(隣接無)と1(隣接有)で表す。自分自身との隣接定義個所は0とし、要素配置場所を5単位に区切り、5に満たない個所は0で埋める。図38(a)の例ではX10は存在しないのでその個所は0とする。
C(1)・・01001 00000
C(2)・・10101 00000
C(3)・・01011 01000
C(4)・・00100 01000
C(5)・・11100 11000
C(6)・・00001 01100
C(7)・・00111 10110
C(8)・・00000 11010
C(9)・・00000 01100
【0237】
制約条件として要素間隣接定義を使用する場合は、隣接定義方式唯一解判定画面(図39)に「要素間隣接定義」ボタンを追加する。このボタンが押下されたら、要素間隣接定義作成画面(図50)を表示し、各要素を配置する要素配置場所を指定する。
【0238】
図50の設定例では、要素P1(第1グループ第1要素)は要素配置場所X4(新潟)に配置しているがその場合、図39の配置場所間隣接定義64よりX3(富山)とX7(長野)のみに隣接可能なので、R1(第3グループ第1要素)とP2(第1グループ第2要素)のみに要素間隣接が可能である。
【0239】
そこで、「戻る」ボタン押下時に、各要素配置場所における要素間隣接の可否をメモリ02(図40)の要素間隣接定義80、すなわちD(X)に保存する。Xは要素を表す数字(実施例では1〜10)であり、以下のように各要素配置場所との要素間隣接可否を5桁単位の0又は1でセットする。
【0240】
例えば、図39、図50の場合は以下のようになる。各要素(P1〜P4、Q1〜Q3、R1〜R3)の他要素との要素間隣接定義を0(隣接不可)と1(隣接可)で表す。自分自身との要素間隣接定義個所は0とし、要素配置場所を5単位に区切り、5に満たない個所は0で埋める。
【0241】
以下左列からP1、P2、P3、P4、Q1、Q2、Q3、R1、R2、R3の順に隣接可否(1/0)をセット
P1・・D(1)・・01000 00100
P2・・D(2)・・10110 01111
P3・・D(3)・・01010 00000
P4・・D(4)・・01100 00000
Q1・・D(5)・・00000 11010
Q2・・D(6)・・00001 01110
Q3・・D(7)・・01001 10101
R1・・D(8)・・11000 11010
R2・・D(9)・・01001 10101
R3・・D(10)・01000 01010
【0242】
ステップS211で、ステップS210で読み込んだ初期配置設定63を配置場所初期配置要素レベル値76、すなわち配列変数LI(L,X)に保存する。Lは重なり順位、Xは配置場所を表す数字(実施例では1〜9)で、グループ番号(実施例では1〜3)に100を掛けた値に要素番号(実施例では1〜4)を加算した値をセットし、未設定の場合は0をセットする。
【0243】
初期配置の段階で1つの配置場所に2つの要素が重なる場合は、グループ番号の昇順に、最初の要素ではL=1、次の要素ではL=2となる。例えば、第2グループ第3要素と第3グループ第2要素が配置場所X=5で重なっている場合は、LI(1,5)に203、LI(2,5)に302をセットする。
【0244】
また、初期配置設定63は各要素配置場所初期値79、すなわち配列変数WI(G,E)にも保存する。Gはグループ番号、Eは要素番号で、配置場所を表す数字(実施例では1〜9)をセットし、未設定の場合は0をセットする。図40の実施例ではグループ数の最大値を5、要素数の最大値を7としてメモリ領域を確保している。
【0245】
ステップS212で、ループ処理で使用する要素配置場所の座標変数xを1に初期化し、ステップS219で変数xに1を加算しながら、ステップS213で変数xの上限チェックを行い、ステップS214からステップS219の処理を繰り返す。配置場所数が9の実施例では、この処理を9回(変数xを1〜9)繰り返すことになる。
【0246】
ステップS214で、配置場所初期配置要素レベル値76を配置場所配置要素レベル値75にコピーする。また、各要素配置場所初期値79を各要素配置場所78にコピーする。
【0247】
ステップS215で、第1グループ第1要素の各要素配置場所初期値WI(1,1)が0(未設定)ならばS217へ行き、通常のループ処理を行う。設定済ならばステップS216を実行し、第1グループ第1要素の初期配置設定値WI(1,1)をxにセットする。また、この場合は、ステップS218で処理を終了し、ループ処理は行わない。
【0248】
ステップS217で、サブルーチン「要素隣接配置処理」(図43)を呼ぶ。その際、第1引数(現グループ番号)に1、第2引数(現要素番号)に1、第3引数(現配置場所)に変数xをセットする。
【0249】
サブルーチン「要素隣接配置処理」では、最初に、引数で渡される現在の要素を配置する処理(ステップS221の各要素配置場所への配置位置保存とステップS222のレベル値設定)を行うとともに、次の要素の処理へつなげる。最後に、ステップS233で、引数で渡される現在の要素配置場所とその下位レベルの配置をクリアする処理を行う。
以下、図43のフローチャートに沿って説明する。
【0250】
まず、ステップS220で、引数をサブルーチン内部変数に取り込む。
【0251】
ステップS221で、各要素配置場所を保存する変数78(図40。W、第1添字はグループ番号、第2添字は要素番号)に現配置場所(1〜9)をセットする。
【0252】
ステップS222で、サブルーチン「レベル値設定処理」(図44)を呼ぶ。その際、第1引数(グループ番号)に現グループ番号、第2引数(要素番号)に現要素番号、第3引数(配置場所)に現配置場所をセットする。
【0253】
ステップS223で、第2引数の現要素番号に1を加算して次要素番号とする。次のステップS224で、この次要素番号がその属するグループの最大要素番号を超えたかどうかを判定し、超えない場合、すなわち次要素番号が存在する場合はステップS225、超える場合、すなわち次要素番号が存在しない場合はステップS226を処理する。
【0254】
ステップS225で、サブルーチン「次要素処理」(図45)を呼ぶ。その際、第1引数(グループ番号)に現グループ番号、第2引数(要素番号)に次要素番号、第3引数(配置場所)に現配置場所をセットする。その処理後ステップS233へ行く。
【0255】
ステップS226で、第1引数の現グループ番号に1を加算した値を次グループ番号とする。次のステップS227で、この次グループ番号がメモリ02(図40)のグループ数71を超えたかどうかを判定し、超えない場合、すなわち次グループ番号が存在する場合はステップS228、超える場合、すなわち次グループ番号が存在しない場合はステップS229の出力処理を実行し、ステップS230で出力件数に1を加算する。
【0256】
ステップS229の出力処理では、メモリ02(図40)に保存されている各要素の配置場所データを唯一解レコードとして外部メモリ01に出力する。出力項目は図41のとおり。
【0257】
出力項目のうち、パターン分類(PTYPE)は以下のように算出した値をセットする。
(1) 隣接定義の32進表記
C(1)からC(9)の5桁の2進数を1桁の32進文字(0〜9,A〜V)に変換する。
第1要素の隣接定義・・90
第2要素の隣接定義・・L0
第3要素の隣接定義・・B8
第4要素の隣接定義・・48
第5要素の隣接定義・・SO
第6要素の隣接定義・・1C
第7要素の隣接定義・・7M
第8要素の隣接定義・・0Q
第9要素の隣接定義・・0C
【0258】
(2) 配置場所位相を表す文字列の生成
頭3桁に要素配置場所数、4桁目以降に上記32進文字列を順に追加して、
00990L0B848SO1C7M0Q0C
という配置場所位相を表す文字列を生成する。
【0259】
(3) パターン分類の生成
配置場所位相を表す文字列に書くグループの要素数を連結した文字列をパターン分類とする。例えば、要素4−3−3の場合は、以下のようになる。
00990L0B848SO1C7M0Q0C433
【0260】
パターン分類を表す記号は、要素配置場所がマス目の場合は、1桁目はマス目の列数、2桁目はマス目の行数、3桁目以降は各グループの要素数とする。要素配置場所の位相の場合は、要素配置場所の位相を表す文字列に続けて各グループの要素数とする。
【0261】
ステップS231で、出力件数が1を超えたかどうかを判定し、1を越えた場合は画面(図39)に「唯一解ではありません」というメッセージを出力後、処理を終了する。
【0262】
1を超えない場合は、画面(図39)の件数欄67に「1」を出力し、ステップS233へ行く。
【0263】
ステップS228で、サブルーチン「次グループ処理」(図49)を呼ぶ。その際、引数(グループ番号)に次グループ番号をセットする。その処理後ステップS233へ行く。
【0264】
ステップS233で、現グループ番号に100を掛けた値に現要素番号を加算した値を引数(レベル値)にセットし、サブルーチン「レベル値クリア処理」を呼ぶ。この処理により現在の設置場所の要素とその下位レベルの要素への配置がすべてクリアされる。
【0265】
要素間隣接定義を制約条件として使用する場合は、サブルーチン「要素隣接配置処理」のステップS227以降は図51のようになる。
【0266】
すなわち、ステップS234で要素配置組み合わせが要素間隣接定義を満たしているかどうかをチェックし、満たしていればステップS229以降の処理を行い、満たしていなければステップS233へ行く。
【0267】
サブルーチン「レベル値クリア処理」は、メモリ02(図40)の配置場所配置要素レベル値75の値が引数で指定されたレベル値と同じ又は大きい値の場合にゼロクリアする処理である。これは指定した要素とその下位レベルの要素の配置場所への配置を取り消す処理である。
【0268】
当サブルーチン処理を終了し、元の処理に戻る。
【0269】
サブルーチン「次要素処理」(図45)では、現在の要素の配置場所を基点にして隣接する配置場所を次の要素の位置として配置処理を行う。すなわち、第2要素以降の従属要素(直前の配置場所に隣接する配置場所にしか置けない要素)の配置処理である。
以下、図45のフローチャートに沿って説明する。
【0270】
ステップS250で、引数をサブルーチン内部変数に取り込む。
【0271】
ステップS251で、ループ処理で隣接位置を表す変数として使用する隣接番号に1をセットする。
【0272】
ステップS252で、隣接番号が配置場所数を超えたら、当サブルーチンから元の処理に戻る。超えなければ、ステップS253以下の処理を実行する。
【0273】
ステップS253で、メモリ02(図40)の隣接定義77の変数C(添え字が現配置場所)の値(配置場所数の長さの文字列)は現配置場所における他の配置場所との隣接有無が配置場所順にセットされているので、その文字列の頭から隣接番号番目の文字が0なら隣接無と判断しステップS256へ行く。また1ならば隣接有と判断し、ステップS255の次要素配置処理を実行する。
【0274】
ステップS255で、サブルーチン「次要素配置処理」を呼ぶ。その際、第1引数に隣接番号、第2引数に現グループ番号、第3引数に次要素番号、第4引数に現配置場所をセットする。
【0275】
ステップS256で隣接番号に1を加算して、ステップS252に戻る。
【0276】
サブルーチン「次要素配置処理」では、引数で指定された隣接番号の配置場所に配置可能かをチェックし、配置可能ならサブルーチン「要素隣接配置処理」を呼ぶ。なお、このサブルーチンはメイン処理のステップS217で呼ばれたサブルーチンと同一で再帰関数となっている。
以下、図46のフローチャートに沿って説明する。
【0277】
まず、ステップS260で、引数をサブルーチン内部変数に取り込む。
【0278】
ステップS261で、サブルーチン「配置可能チェック」を呼ぶ。その際、第1引数(次配置場所)に隣接番号をセットする。その結果により、チェックOKであればサブルーチン「要素隣接配列処理」を実行する。その際、第1引数に現グループ番号、第2引数に次要素番号、第3引数に次配置場所をセットする。当サブルーチン処理を終了し、元の処理に戻る。
【0279】
チェックNGであれば当サブルーチン処理を終了し、元の処理に戻る。
【0280】
サブルーチン「配置可能チェック」では、引数で指定された配置場所に配置が可能かどうかをチェックし、配置可能なら戻り値をチェックOKとし、配置不可なら戻り値をチェックNGとする。
以下、図47のフローチャートに沿って説明する。
【0281】
まず、ステップS270で、引数をサブルーチン内部変数に取り込む。
【0282】
ステップS271で、引数で指定された配置場所1箇所だけで、メモリ02(図40)の重なり要素数73を超えてしまうかどうかをチェックする。
すなわち、L(2,配置場所)が0以外であれば、チェックNGとして当サブルーチン処理を終了し、元の処理に戻る。
【0283】
ステップS272では、メモリ02(図40)の重なり要素数73が1以上の場合に以下のチェックを行う。最初に引数で指定された配置場所について現時点の重なり数に1をプラスした値を算出する。次に、引数で指定された配置場所を除くすべてのマス目において現時点の重なり数を合計した値を算出する。そして、両者を合わせた値が重なり要素数を超えてしまうかどうかをチェックする。超えた場合はチェックNG、超えない場合はチェックOKとして当サブルーチン処理を終了し、元の処理に戻る。
【0284】
サブルーチン「次グループ処理」は、第2グループ以降の第1要素(独立要素)を配置する処理である。
以下、図49のフローチャートに沿って説明する。
【0285】
ステップS290で、引数の次グループ番号を内部変数gに取り込む。
【0286】
ステップS291で、ループ処理で使用する配置場所数を保持する変数xを1に初期化し、ステップS296で変数xに1を加算しながら、ステップS292で変数xの上限チェックを行い、ステップS293からステップS295の処理を繰り返す。
【0287】
ステップS293で、サブルーチン「配置可能チェック」(既出)を呼ぶ。その際、引数に変数xをセットする。その結果により、配置可能であればステップS295で要素隣接配置処理(既出、再帰関数)を実行した後にステップS296へ行く。配置不可であればステップS296へ行く。
【0288】
ステップS295で、サブルーチン「要素配置処理」を呼ぶ際、第1引数(現グループ番号)に次グループ番号、第2引数(現要素番号)に1、第3引数(配置場所)に変数xをセットする。
【0289】
次に、以上の装置により算出された唯一解を利用したパズルの提供方法について、五・七・五の俳句を題材とした実施例1と、都道府県の観光地の旅程を題材とした実施例2を説明する。
【0290】
実施例1は、図1(a)のような3つの句からなる俳句と、図1(b)のような制約条件としていくつかのモーラが配置された縦4列横4行に区切られたマス目の描かれた平面を提示し、残りのモーラの配置を探すパズルゲームへの応用である。
ルールは以下のとおりとする。
【0291】
(1) 各グループの第1要素は配置場所のいずれにも配置することができる。(この性質を「独立」という)
(2) 1つのグループに属する隣り合う要素は隣接して配置(マス目の場合は上下左右に配置)しなければならない。すなわち、第2要素以降は直前の要素に隣接して配置する。(この性質を「従属」という)
(3) 1つのグループに属する要素同士は、同じ要素であっても1つの配置場所に重ねて配置することができない。
(4) 異なるグループに属する要素同士は、同じ要素であれば1つの配置場所に重ねて配置することができる。
(5) 配置場所に空きが出来ないように、提示されたグループの要素すべてを配置場所に配置する。
【0292】
第1グループ「かわずとびこむ」、第2グループ「ふるいけや」、第3グループ「みずのおと」の中で、
第1グループ第3要素(P3)と第3グループ第2要素(R2)および、第1グループ第4要素(P4)と第3グループ第5要素(R5)のそれぞれの要素が共通で、このいずれか1つが重なる場合なので、重なり要素関係分類は「P3R2+P4R5」になる。
【0293】
別の例として、第1グループ「つるべとられて」、第2グループ「あさがおに」、第3グループ「もらいみず」の中で、第1グループ第5要素(P5)と第3グループ第2要素(R2)の要素が共通なので、重なり要素関係分類は「P5R2」になる。
【0294】
別の例として、第1グループ「うしにひかれて」、第2グループ「はるかぜや」、第3グループ「ぜんこうじ」の中で、第1グループ第1要素(P1)と第3グループ第4要素(R4)および、第1グループ第5要素(P5)と第2グループ第3要素(Q3)および、第2グループ第4要素(Q4)と第3グループ第1要素(R1)のそれぞれの要素が共通で、このいずれか1つが重なる場合なので、重なり要素関係分類は「P1R4+P5Q3+Q4R1」になる。
【0295】
実施例1では重なり数が1なので、重なり要素関係分類は、以下のようになる。
(1) 共通モーラが1組の場合
第1グループ第3要素(P3)と第3グループ第2要素(R2)なら「P3R2」になる。
(2) 共通モーラが2組の場合
「P3R2+P4R5」のように+記号で2つの組を合併する。
これは「第1グループ第3要素(P3)と第3グループ第2要素(R2)とが重なる組み合わせ、又は、第1グループ第4要素(P4)と第3グループ第5要素(R5)とが重なる組み合わせのいずれか」という意味である。
(3) 共通モーラが3組の場合
「P3R2+P4R3+P6Q5」のように3つの組み合わせを+記号で合併する。
【0296】
重なり要素関係分類は「P3R2+P4R5」は、重なり要素関係分類「P3R2」の配置組み合わせと重なり要素関係分類「P4R5」の配置組み合わせを合併したものになる。
【0297】
要素関係分類が「P3R2+P4R5」の組み合わせレコードは1408件あるが、制約条件の優先順位第1位である各グループの第1要素位置、すなわち、第1グループ第1要素(P1)と第2グループ第1要素(Q1)と第3グループ第1要素(R1)の3つの要素をキーに集計して作成した集計結果レコードの集計レコード件数が1件の集計結果レコード(唯一レコード)は184件あり、パズル問題はこの唯一レコードから作成することができる。
【0298】
実施例1では重なり数は1だったが、重なり数が2の場合は、重なり要素関係分類は、以下のようになる。
(1) 共通モーラが2組の場合
「P3R2*P4R5」のように*記号で2つの組を結合する。これは「第1グループ第3要素(P3)と第3グループ第2要素(R2)とが重なる組み合わせと、第1グループ第4要素(P4)と第3グループ第5要素(R5)とが重なる組み合わせの共通部分」という意味である。
(2) 共通モーラが3組の場合
「P3R2*P4R3+P3R2*P6Q5+P4R3*P6Q5」のように3つの共通部分を+記号で合併する。
(3) 共通モーラが4組の場合
4組の中から2組を選んで作成した6つの共通部分を+記号で合併する。例えば、P3R2をA、P4R3をB、P6Q5をC、Q2R4をDと置き換えた場合、以下のようになる。
A*B+A*C+A*D+B*C+B*D+C*D
【0299】
重なり数が3の場合は、重なり要素関係分類は、以下のようになる。
(1) 共通モーラが3組の場合
「P3R2*P4R5*P6Q5」のように*記号で3つの組を合併する。これは「第1グループ第3要素(P3)と第3グループ第2要素(R2)とが重なる組み合わせと、第1グループ第4要素(P4)と第3グループ第5要素(R5)とが重なる組み合わせと、第1グループ第6要素(P6)と第2グループ第5要素(Q5)とが重なる組み合わせの共通部分」という意味である。
(2) 共通モーラが4組の場合
4組の中から3組を選んで作成した4つの共通部分を+記号で合併する。例えば、P3R2をA、P4R5をB、P6Q5をC、Q2R4をDと置き換えた場合、以下のようになる。
A*B*C+A*B*D+A*C*D+B*C*D
【符号の説明】
【0300】
01 外部メモリ
02 メモリ
03 ディスプレイ
04 キーボード
05 CPU
11 メモリの列数保存領域
12 メモリの行数保存領域
13 メモリのグループ数保存領域
14 メモリの各グループ要素数保存領域
15 メモリの重なり要素数保存領域
16 メモリの重なり要素レベル値保存領域
17 メモリの各要素のマス目への配置位置保存領域
20 配置組み合わせ出力部画面の列数入力テキストボックス
21 配置組み合わせ出力部画面の行数入力テキストボックス
22 配置組み合わせ出力部画面のグループ数入力テキストボックス
23 配置組み合わせ出力部画面のグループ要素数入力テキストボックス
24 配置組み合わせ出力部画面の処理実行開始ボタン
25 配置組み合わせ出力部画面の重なり要素数表示領域
26 配置組み合わせ出力部画面の件数表示領域
30 唯一解出力部画面のパターン分類選択コンボボックス
31 唯一解出力部画面の重なり要素関係分類選択コンボボックス
32 唯一解出力部画面の制約条件優先順位入力領域
33 唯一解出力部画面の唯一解件数
34 唯一解出力部画面の処理実行開始ボタン
40 一段階方式唯一階算出画面の列数入力テキストボックス
41 一段階方式唯一階算出画面の行数入力テキストボックス
42 一段階方式唯一階算出画面のグループ数入力テキストボックス
43 一段階方式唯一階算出画面のグループ要素数入力テキストボックス
44 一段階方式唯一階算出画面の処理実行開始ボタン
45 一段階方式唯一階算出画面の重なり要素数表示領域
46 一段階方式唯一階算出画面の件数表示領域
47 一段階方式唯一階算出画面の制約条件(グループ要素単位)入力コンボボックス
48 一段階方式唯一階算出画面の制約条件(マス目単位)入力コンボボックス
49 一段階方式唯一階算出画面の画面切り替えボタン
50 メモリ(一段階方式)の列数保存領域
51 メモリ(一段階方式)の行数保存領域
52 メモリ(一段階方式)のグループ数保存領域
53 メモリ(一段階方式)の重なり要素数保存領域
54 メモリ(一段階方式)の各グループ要素数保存領域
55 メモリ(一段階方式)の重なり要素レベル値保存領域
56 メモリ(一段階方式)の初期配置重なり要素レベル値保存領域
57 メモリ(一段階方式)の各要素のマス目への配置位置保存領域
58 メモリ(一段階方式)の各要素のマス目への初期配置位置保存領域
60 隣接定義方式唯一階算出画面の配置場所数入力テキストボックス
61 隣接定義方式唯一階算出画面のグループ数入力テキストボックス
62 隣接定義方式唯一階算出画面のグループ要素数テキストボックス
63 隣接定義方式唯一階算出画面の初期配置設定入力コンボボックス
64 隣接定義方式唯一階算出画面の配置場所間隣接定義チェックボックス
65 隣接定義方式唯一階算出画面の処理実行開始ボタン
66 隣接定義方式唯一階算出画面の重なり要素数表示領域
67 隣接定義方式唯一階算出画面の件数表示領域
68 隣接定義方式唯一階算出画面の隣接定義の双方向・単方向切り替えボタン
69 隣接定義方式唯一階算出画面の単方向設定の場合の逆方向隣接定義領域
Xn→Xm(n>m)の隣接定義も独立に設定可能になる
70 メモリ(隣接定義方式)の配置場所数保存領域
71 メモリ(隣接定義方式)のグループ数保存領域
72 メモリ(隣接定義方式)の各グループ要素数保存領域
73 メモリ(隣接定義方式)の重なり要素数保存領域
74 メモリ(隣接定義方式)の重なり配置場所保存領域
75 メモリ(隣接定義方式)の配置場所配置要素レベル値保存領域
76 メモリ(隣接定義方式)の配置場所初期配置要素レベル値保存領域
77 メモリ(隣接定義方式)の隣接定義保存領域
78 メモリ(隣接定義方式)の各要素配置場所保存領域
79 メモリ(隣接定義方式)の各要素配置場所初期値保存領域
80 メモリ(隣接定義方式)の要素間隣接定義保存領域
90 要素間隣接定義作成画面の要素を示す記号
91 要素配置場所を選択するコンボボックス
92 メモ入力欄。要素名を記述
93 戻るボタン

【特許請求の範囲】
【請求項1】
複数の要素配置場所が描かれ、その各々が他の要素配置場所との隣接有無が定義されている平面と、順序を有する要素の集合であるグループが複数個提示されて、各要素を要素配置場所に配置する際に、要素が置かれていない要素配置場所が無いように、同一グループに属する要素は同一であっても1つの要素配置場所に重ねて配置することはできないが、異なるグループに属する同一の要素は1つの要素配置場所に重ねて配置することができ、各グループの要素を隣接する要素配置場所に順序に従い連続して配置するというルールのパズルの問題を提供するために、
要素配置場所や要素の初期条件と、配置が唯一解になるための制約条件を入力する機能と、
入力された初期条件と制約条件をメモリに読み込み、メモリに割り当てた要素配置場所と各要素の配置組み合わせを保存する領域に、初期条件と制約条件とルールを満たすすべての配置組み合わせを実現し、その中から要素配置場所と各要素の配置組み合わせが唯一解になるかどうかを判定する制御演算機能と、
その唯一解の要素配置場所と要素の配置組み合わせデータを出力する機能と、
を備えた要素配置唯一解算出装置。
【請求項2】
第1段階として、提示された要素配置場所と要素の初期条件とルールを満たす要素配置場所と要素の配置組み合わせをレコードとして出力し、
第2段階として、上記配置組み合わせレコードのうち、選択された重なり要素関係分類(要素と別の要素が任意の要素配置場所で重なっている関係で、その和集合、積集合、空集合を含む)のレコードを抽出し、さらに一部の要素を要素配置場所へあらかじめ配置することによる制約条件を満足する配置組み合わせレコードが唯一解になるかどうかを判定し、唯一解であれば要素と要素配置場所の組み合わせデータを出力する二段階方式要素配置唯一解算出プログラムを備えた請求項1の要素配置唯一解算出装置。
【請求項3】
ルール、要素配置場所と要素の初期条件および、一部の要素を要素配置場所へあらかじめ配置することによる制約条件を満たす配置組み合わせが唯一解になるかどうかを判定し、唯一解であれば要素と要素配置場所の組み合わせデータを出力する一段階方式要素配置唯一解算出プログラムを備えた請求項1の要素配置唯一解算出装置。
【請求項4】
要素配置場所間の隣接定義を画面から又はテキストファイルの読み込みによって設定することを可能にした要素配置唯一解算出プログラムを備えた請求項1の要素配置唯一解算出装置。
【請求項5】
一部の要素を要素配置場所へあらかじめ配置することによる制約条件が、唯一解を探す際に適用する各種制約条件の適応優先順位である要素配置唯一解算出プログラムを備えた請求項2の要素配置唯一解算出装置。
【請求項6】
配置が唯一解になるための制約条件の一部または全部が、要素と要素が隣接可能かどうかの定義である要素配置唯一解算出プログラムを備えた請求項1の要素配置唯一解算出装置。
【請求項7】
複数の要素配置場所が描かれ、その各々に対し他の要素配置場所との隣接有無が定義されている平面と、順序を有する要素の集合であるグループが複数個提示されて、各要素を要素配置場所に配置する際に、要素が置かれていない要素配置場所が無いように、同一グループに属する要素は同一であっても1つの要素配置場所に重ねて配置することはできないが、異なるグループに属する同一の要素は1つの要素配置場所に重ねて配置することができ、各グループの要素を隣接する要素配置場所に順序に従い連続して配置するというルールのパズルの問題を、一部の要素の要素配置場所への配置や要素と要素が隣接可能かどうかの定義による制約条件により、唯一解となることがあらかじめ確かめられている配置組み合わせの中から出題するパズルゲームの提供方法。
【請求項8】
複数の要素配置場所が縦横に隣接する縦4列横4行の16個のマス目で、順序を有する要素の集合であるグループが3つの句からなる俳句で、その要素がモーラ(一定の時間的長さをもった音の分節単位)であり、制約条件がその俳句の中のいくつかのモーラを要素配置場所へ初期配置することである請求項7のパズルゲームの提供方法。
【請求項9】
複数の要素配置場所が縦横に隣接する縦5列横6行または縦6列横5行の30個のマス目で、順序を有する要素の集合であるグループが5つの句からなる短歌で、その要素がモーラであり、制約条件がその短歌の中のいくつかのモーラを要素配置場所へ初期配置することである請求項7のパズルゲームの提供方法。
【請求項10】
複数の要素配置場所が現実の地理区域すなわち国、都道府県、又は駅・港の隣接有無に基づいて作成された要素配置場所で、順序を有する要素の集合であるグループが都市や観光地を巡る旅程又は交通ダイヤで、その要素が国、都道府県、都市、観光地又は駅・港であり、制約条件がいくつかの要素を要素配置場所へ初期配置するか、要素間の隣接可否か、又はその双方である請求項7のパズルゲームの提供方法。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate

【図10】
image rotate

【図11】
image rotate

【図12】
image rotate

【図13】
image rotate

【図14】
image rotate

【図15】
image rotate

【図16】
image rotate

【図17】
image rotate

【図18】
image rotate

【図19】
image rotate

【図20】
image rotate

【図21】
image rotate

【図22】
image rotate

【図23】
image rotate

【図24】
image rotate

【図25】
image rotate

【図26】
image rotate

【図27】
image rotate

【図28】
image rotate

【図29】
image rotate

【図30】
image rotate

【図31】
image rotate

【図32】
image rotate

【図33】
image rotate

【図34】
image rotate

【図35】
image rotate

【図36】
image rotate

【図37】
image rotate

【図38】
image rotate

【図39】
image rotate

【図40】
image rotate

【図41】
image rotate

【図42】
image rotate

【図43】
image rotate

【図44】
image rotate

【図45】
image rotate

【図46】
image rotate

【図47】
image rotate

【図48】
image rotate

【図49】
image rotate

【図50】
image rotate

【図51】
image rotate


【公開番号】特開2013−78484(P2013−78484A)
【公開日】平成25年5月2日(2013.5.2)
【国際特許分類】
【出願番号】特願2011−220415(P2011−220415)
【出願日】平成23年10月4日(2011.10.4)
【出願人】(711010954)