2014-11-23 72 views
2

我试图解决Petersen Graph问题没有任何成功。这段代码有什么问题?你可能会说这不是一个有效的解决方案,没关系。在这里,我为给定的图形做DFS。为什么这段代码给出Petersen Graph(codechef)的WA?

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

该代码几乎无法通过我试过的每个测试用例。我认为问题出在traverse,for语句条件中的if循环中(行4551)。

if(z[v].s[i]==s[index]) 

在这里,你想指数x,这样z[x].p等于vv并不总是正确的索引,所以z[v]不正确。同样在另一行。尝试测试用例'EE'和'ABCD'。

我认为按照Z [i] .p值的顺序重新排列Z阵列是最容易的。