我试图解决Petersen Graph问题而没有任何成功。这段代码有什么问题?你可能会说这不是一个有效的解决方案,没关系。我在这里,为给定的图做DFS。
sruct ss
包含图表。每个String
都保存在Set
中,每当递归终止时,就会生成一个输出。我找不到这种方法失败的测试用例。你能给我一个这种方法失败的测试案例吗?
#include<bits/stdc++.h>
using namespace std;
struct ss{
int p;
int a[3];
char s[3];
};
string get(int k){
switch(k){
case 0:return "0";
case 1:return "1";
case 2:return "2";
case 3:return "3";
case 4:return "4";
case 5:return "5";
case 6:return "6";
case 7:return "7";
case 8:return "8";
case 9:return "9";
}
}
void traverse(string s,ss z[10],int index, set<string> &s1,string s2,int v){
int p = s[index]-'A',i,j;
if(v!=-1)s2 +=get(v);
if(!s[index]){
s1.insert(s2);
return;
}
if(v==-1){
traverse(s,z,index+1,s1,s2,z[2*p].p);
traverse(s,z,index+1,s1,s2,z[2*p+1].p);
}
else{
if(v>=5){v = v-5;v = 2*v+1;}
for(i=0;i<3;i++){
if(z[v].s[i]==s[index]){
traverse(s,z,index+1,s1,s2,z[v].a[i]);
break;
}
}
for(j=0;j<3;j++){
if(z[v].s[j]==s[index]){
traverse(s,z,index+1,s1,s2,z[v].a[j]);
break;
}
}
}
}
int main(){
string s;
set<string> s1;
int t;
ss z[ ]={
{0,{1,4,5},{'B','E','A'}},
{5,{0,7,8},{'A','C','D'}},
{1,{0,2,6},{'A','C','B'}},
{6,{1,8,9},{'B','D','E'}},
{2,{1,3,7},{'B','D','C'}},
{7,{2,5,9},{'C','A','E'}},
{3,{2,4,8},{'C','E','D'}},
{8,{3,5,6},{'D','A','B'}},
{4,{0,3,9},{'A','D','E'}},
{9,{4,6,7},{'E','B','C'}}
};
cin>>t;
while(t--){
s1.clear();
cin>>s;
traverse(s,z,0,s1,"",-1);
if(s1.end()==s1.begin()){
cout<<-1<<"\n";
}
else
cout<<*s1.begin()<<"\n";
}
}
答案 0 :(得分:0)
代码几乎失败了我尝试的每个测试用例。我认为问题出在traverse
,在for循环中的if语句条件中(行45
和51
)。
if(z[v].s[i]==s[index])
在这里,您需要索引x
,以使z[x].p
等于v
。 v
并不总是正确的索引,因此z[v]
不正确。同样在另一条线上。尝试测试用例'EE'和'ABCD'。
我认为以Z [i] .p值的顺序重新排序Z数组是最容易的。