题目:
思路分析:
一个dfs+剪枝的题目:
直接用stl中的全排只能拿16分
代码实现:
const int MAX=101;
int n;
int ans[MAX];
int vis[MAX];
int vs[MAX][MAX];
int flag=0;
int dfs(int pos,int num){
if(pos>n){
if(vs[ans[pos-1]][ans[1]]==1){
flag=1;
for(int i=1;i<=n;i++){
if(i==1) cout<<ans[i];
else cout<<" "<<ans[i];
}
return 1;
}
return 0;
}
int ans1;
bool cut=false;
for(int i=1;i<=n;i++)
if(!vis[i]&&vs[i][1]==1&&i!=1)
cut=true;
if(!cut) return false;
for(int i=1;i<=n;i++){
if(!vis[i]&&vs[num][i]==1){
vis[i]=1;
ans[pos]=i;
ans1=dfs(pos+1,i);
if(ans1) break;
vis[i]=0;
}
}
return ans1;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
getchar();
for(int j=1;j<=n;j++){
char c;
cin>>c;
if(c=='W'||c=='-'){
vs[i][j]=1;
}
else if(c=='L')
vs[j][i]=1;
}
}
flag=0;
dfs(1,1);
if(!flag) cout<<"No solution"<<endl;
}
const int MAX=21;
char a[MAX][MAX];
int b[MAX];
int n;
int flag=1;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
b[i]=i;
}
// int num=1;
do{
// for(int i=1;i<=n;i++){
// cout<<b[i]<<" ";
// }
// cout<<endl;
flag=1;
// cout<<num++<<endl;
for(int i=2;i<=n;i++){
if(a[b[i-1]][b[i]]!='W'){
flag=0;
}
// cout<<a[b[i-1]][b[i]];
}
// cout<<endl;
if(flag==1&&a[b[n]][1]=='W'){
for(int i=1;i<=n;i++){
if(i==1) cout<<b[i];
else cout<<" "<<b[i];
}
return 0;
}
}
while (next_permutation(b+1,b+1+n));
if(flag==0) cout<<"No Solution";
}