输入样例1:
5
-LWDW
W-LDW
WW-LW
DWW-W
DDLW-
输出样例1:
1 3 5 4 2
输入样例2:
5
-WDDW
D-DWL
DD-DW
DDW-D
DDDD-
输出样例2:
No Solution
dfs遍历,要注意的是两两相互对局,给出的样例图并不是对称的。写到有一个测试点超时时,就感觉突破口是食物链最后的点连接着第一个点。
#include<bits/stdc++.h>
using namespace std;
#define mk make_pair
const int N=30;
char a[N][N];
int n,v1[N],v2[N],flag;
vector<int>ans;
void dfs(int pos){
if(flag) return;
int f=0;
for(int i=0;i<n;i++){
if(v1[i]==0&&(a[i][0]=='W'||a[0][i]=='L')){
f=1;break;
}
}
if(!f) return;
ans.pb(pos);
if(ans.size()==n){
if(a[pos][0]=='W'||a[0][pos]=='L'){
for(int i=0;i<n;i++){
if(i) printf(" ");
printf("%d",ans[i]+1);
}
flag=1;
}
ans.pop_back();
return;
}
v1[pos]=1;
for(int i=0;i<n;i++){
if(v1[i]==0&&(a[pos][i]=='W'||a[i][pos]=='L')){
dfs(i);
}
}
ans.pop_back();
v1[pos]=0;
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%s",&a[i]);
}
dfs(0);
if(flag==0) puts("No Solution");
return 0;
}