L3-015 球队“食物链” (30 分)
爆搜22分,加上剪枝30分
剪枝就是看能不能到达第一个,如果剩下的所有点都不能到达第一个点,就直接返回
const int maxn = 30;
int ans[maxn],N;
char Ma[maxn][maxn];
bool vis[maxn];
bool dfs(int u,int d){
bool yes = false;
for(int i = 0;i < N; ++i)
if(!vis[i] &&(Ma[i][0] == 'W' || Ma[0][i] == 'L'))
yes = true;
if(!yes) return false;
// cout<<u<<endl;
ans[d] = u;
vis[u] = 1;
if(d == N) {
// cout<<u<<endl;
if(Ma[u][0] == 'W' || Ma[0][u] == 'L'){
for(int i = 1;i <= N; ++i)
printf("%d%c",ans[i]+1," \n"[i==N]);
return true;
}
vis[u] = 0;
return false;
}
for(int i = 0;i < N; ++i)
if(!vis[i] &&(Ma[u][i] == 'W' || Ma[i][u] == 'L'))
{
// cout<<d <<" "<<u<<" "<<i<<endl;
if(dfs(i,d+1))
return true;
}
vis[u] = 0;
return false;
}
int main(void)
{
cin>>N;
for(int i = 0;i < N; ++i)
cin>>Ma[i];
if(!dfs(0,1))
cout<<"No Solution"<<endl;
return 0;
}