题目链接
题意:就是找一个环,使环上的每一个点都有赢下一个点的情况。
就是一个dfs+剪枝,剪枝就是每个点都要判断一下能否有一个点能够赢第一个点,但判断的时候要在还剩一个点的时候,这样讲可能有点抽象,下面是超时一个点代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
char c[25][25];
vector<int> ans;
vector<int> win[25];
vector<int> cop;
bool st[25];
int cou=0;
int n;
int ma[30][30];
bool fail[25];
void dfs(int u)
{
int i;
for(i=2; i<=n; i++)
{
if(!st[u]&&ma[i][1]==1)
{
break;
}
}
if(i==n+1) return ;
cop.push_back(u);
st[u]=true;
if(cop.size()==n&&cou==0)
{
int flag=0;
int k=win[cop[n-1]].size();
for(int i=0; i<k; i++)
{
if(win[cop[n-1]][i]==cop[0])
{
for(i=0; i<cop.size(); i++)
{
ans.push_back(cop[i]);
}
flag=1;
break;
}
}
if(flag==1)
{
for(int i=0; i<ans.size(); i++)
{
if(i==ans.size()-1) cout<<ans[i]<<endl;
else cout<<ans[i]<<" ";
}
exit(0);
}
}
for(int i=0; i<win[u].size(); i++)
{
int x=win[u][i];
if(!st[x])
{
dfs(x);
}
}
st[u]=false;
cop.pop_back();
}
int main()
{
cin>>n;
for(int i=1; i<=n; i++)
{
cin>>c[i]+1;
}
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
if(c[i][j]=='-') continue;
else if(c[i][j]=='W')
{
ma[i][j]=1;
int flag=0;
for(int k=0; k<win[i].size(); k++)
{
if(win[i][k]==j)
{
flag=1;
break;
}
}
if(flag==0) win[i].push_back(j);
}
else if(c[i][j]=='L')
{
ma[j][i]=1;
int flag=0;
for(int k=0; k<win[j].size(); k++)
{
if(win[j][k]==i)
{
flag=1;
break;
}
}
if(flag==0)
{
win[j].push_back(i);
}
}
}
}
for(int i=1; i<=n; i++) sort(win[i].begin(),win[i].end());
dfs(1);
if(ans.size()==0) cout<<"No Solution"<<endl;
return 0;
}
exit(0)就是直接退出,也可以在退出递归后在输出。