以下に示すようなグラフがあるとします。このグラフはピーターソン図です。頂点には 0 から 9 までの番号が付けられます。各頂点にはいくつかの文字があります。 L 個の頂点を使用して、このグラフ上で W を歩くことを考えます。ウォーキング W の文字列が S と同じ場合、文字列 S はウォーキング W によって実現されます。頂点を複数回訪問できます。
たとえば、文字列 S は「ABBECCD」に似ており、ウォーキング (0、1、6、9、7、2、3) によって実装されます。私たちの仕事は、そのようなウォークを見つけ、そのようなウォークが存在する場合、辞書編集上最小のウォークを見つけることです。そのような四球がない場合は、-1 が返されます。
petersonGraphWalk(S, v) -
begin res := starting vertex for each character c in S except the first one, do if there is an edge between v and c in outer graph, then v := c else if there is an edge between v and c+5 in inner graph, then v := c + 5 else return false end if put v into res done return true end
#include<iostream> using namespace std; bool adj_mat[10][10] = {{0, 1, 0, 0, 1, 1, 0, 0, 0, 0}, {1, 0, 1, 0, 0, 0, 1, 0, 0, 0}, {0, 1, 0, 1, 0, 0, 0, 1, 0, 0}, {0, 0, 1, 0, 1, 0, 0, 0, 1, 0}, {1, 0, 0, 1, 0, 0, 0, 0, 0, 1}, {1, 0, 0, 0, 0, 0, 0, 1, 1, 0}, {0, 1, 0, 0, 0, 0, 0, 0, 1, 1}, {0, 0, 1, 0, 0, 1, 0, 0, 0, 1}, {0, 0, 0, 1, 0, 1, 1, 0, 0, 0}, {0, 0, 0, 0, 1, 0, 1, 1, 0, 0} }; char S[100005]; char res[100005]; bool petersonGraphWalk(char* S, int v){ res[0] = v + '0'; for(int i = 1; S[i]; i++){ //traverse the outer graph if(adj_mat[v][S[i] - 'A'] || adj_mat[S[i] - 'A'][v]){ v = S[i] - 'A'; } //then check the inner graph else if(adj_mat[v][S[i] - 'A' + 5] || adj_mat[S[i] - 'A' + 5][v]){ v = S[i] - 'A' + 5; }else{ return false; } res[i] = v + '0'; } return true; } main() { char* str = "ABBECCD"; if(petersonGraphWalk(str, str[0] - 'A') || petersonGraphWalk(str, str[0] - 'A' + 5)){ cout << res; }else{ cout << -1; } }
以上がC プログラムのピーターソン図の問題の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。