2

決定論的なスタックオートマトンをシミュレートする必要があるUVAの演習を読んで、特定の文字列が次の形式の特定のエントリでDSAによって受け入れられるかどうかを確認しました。

入力の最初の行は、テストケースの数を示す整数Cになります。各テストケースの最初の行には、5つの整数E、T、F、S、およびCが含まれています。ここで、Eはオートマトンの状態の数、Tは遷移の数、Fは最終状態の数、Sは初期状態、 Cそれぞれテスト文字列の数。次の行には、オートマトンの最終状態を表すF個の整数が含まれます。次に、それぞれ2つの整数IとJ、および3つの文字列L、T、Aを持つT行が表示されます。ここで、IとJ(0≤I、J <E)は、それぞれ遷移状態の起点と終点を表します。Lは、テープからトランジションに読み取られた文字を表します。Tはスタックの一番上にあるシンボルを表し、Aはこの遷移の終わりにスタックの一番上で実行するアクションを表します(パイルの一番下を表すために使用される文字は常にZです。文字列、または遷移文字のスタックの最上位を考慮しないアクションをアンスタックします£)。スタックのアルファベットは大文字になります。チェーンAの場合、シンボルは右から左にスタックされます(プログラムJFlapと同じ方法で、つまり、スタックの新しい一番上が左側の文字になります)。次に、それぞれに入力文字列が含まれるC行が表示されます。入力文字列には小文字と数字を含めることができます(必ずしもトランジションに存在する必要はありません)。または、遷移文字のスタックの最上位を考慮しないアクションをアンスタックします£)。スタックのアルファベットは大文字になります。チェーンAの場合、シンボルは右から左にスタックされます(プログラムJFlapと同じ方法で、つまり、スタックの新しい一番上が左側の文字になります)。次に、それぞれに入力文字列が含まれるC行が表示されます。入力文字列には小文字と数字を含めることができます(必ずしもトランジションに存在する必要はありません)。または、遷移文字のスタックの最上位を考慮しないアクションをアンスタックします£)。スタックのアルファベットは大文字になります。チェーンAの場合、シンボルは右から左にスタックされます(プログラムJFlapと同じ方法で、つまり、スタックの新しい一番上が左側の文字になります)。次に、それぞれに入力文字列が含まれるC行が表示されます。入力文字列には小文字と数字を含めることができます(必ずしもトランジションに存在する必要はありません)。

各テストケースの最初の行の出力には、次の文字列「Case G:」が表示されている必要があります。ここで、Gはテストケースの数(1から始まります)を表します。次に、オートマトンが文字列を受け入れる場合は「OK」、それ以外の場合は「拒否」という単語を印刷するC行。

例えば:

Input:
2
3 5 1 0 5
2
0 0 1 Z XZ
0 0 1 X XX
0 1 0 X X
1 1 1 X £
1 2 £ Z Z
111101111
110111
011111
1010101
11011
4 6 1 0 5
3
1 2 b A £
0 0 a Z AZ
0 1 a A AAA
1 0 a A AA
2 3 £ Z Z
2 2 b A £
aabbb
aaaabbbbbb
c1bbb
abbb
aaaaaabbbbbbbbb

これは出力です:

Output:
Case 1:
Accepted
Rejected
Rejected
Rejected
Accepted

Case 2:
Accepted
Accepted
Rejected
Rejected
Accepted   

助けが必要です。または、このDSAをシミュレートする方法についてのアイデアが必要です。自分でコードを作成したいので、問題を解決するコードを求めていません(アイデアは正しく学習することですか??)が、助けが必要です。 (いくつかのアイデアまたは擬似コード)実装を開始します。

4

1 に答える 1

2

まず、遷移を維持するためのデータ構造が必要です。遷移5倍を含む遷移構造体でベクトルを使用できます。ただし、状態が整数であるという事実を使用して、状態0から遷移するインデックス0を維持するベクトルを作成できます。インデックス1では、そのように状態1から遷移します。このようにして、正しい遷移を見つけるための検索時間を短縮できます。

スタック用のstlライブラリのスタックを簡単に使用できます。また、実装に応じて変更できる検索関数も必要です。最初のメソッドを使用する場合は、次のような関数を使用できます。

int findIndex(vector<quintuple> v)//which finds the index of correct transition otherwise returns -1

次に、戻り値を使用してnewstateとnewstackのシンボルを取得します。

または、ベクトル上でforループを使用して、遷移が検出されたかどうかを表すboolフラグを使用することもできます。

2番目の方法では、新しい状態と新しいスタックシンボルへの参照を取得し、適切な遷移が見つかった場合にそれらを設定する関数を使用できます。

入力には、ベクトルのようなものを使用できます。ベクトルは個人の好みによって異なります。forループを使用してmainメソッドを実装できますが、さらに問題が必要な場合は、再帰関数を実装できます。簡単になりますように。

于 2011-07-13T19:27:06.803 に答える