题目
题意:给你n,代表有0 n-1个人,给你n行,每行n个字符,
字符是X,i=j就是这个人在这个位置
1 代表,i人能赢j人当king
0代表输;
游戏规则是b 是king a能赢b a当king
问裁判按什么安排顺序0能当king
思路:
注意,0能打打败多个
可以将问题简化为如果0能胜利,则剩余的n-1个人要么被0打败,要么被0所打败的人打败这几种情况
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+5;
const int inf=0x3f3f3f3f;
typedef long long ll;
int cnt,n,flag=0;
int a[maxn][maxn];//存图
int vis[maxn];//是否出场
int ans[maxn];//存出场顺序
void dfs(int x)
{
if(cnt==n-1)
{
flag=1;
return;
}
else
{
for(int i=0;i<n;i++)
{
if(!vis[i]&&a[x][i])
{
vis[i]=1;
ans[cnt++]=i;
dfs(i);
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
memset(vis,0,sizeof(0));
cin>>n;
string s[n];
for(int i=0;i<n;i++)
cin>>s[i];
for(int i=0;i<n;i++)
{
for(int j=0;j<s[0].size();j++)
{
if(s[i][j]=='X')
a[i][j]=0;
else
a[i][j]=s[i][j]-'0';
}
}
// for(int i=0;i<n;i++)
// {
// for(int j=0;j<n;j++)
// cout<<a[i][j]<<" ";
// cout<<endl;
// }
cnt=0;
vis[0]=1;
dfs(0);
if(!flag)
cout<<"impossible"<<endl;
else
{
for(int i=cnt-1;i>=0;i--)
cout<<ans[i]<<" ";
cout<<0<<endl;
}
}