K - King of the Waves Gym - 101666K
#include<cstdio> #include<cstring> #include<string> #include<vector> #include<iostream> using namespace std; typedef long long ll; /* 这道题,1代表能打过他,0代表打不过 问怎样安排可以使0最后站在擂台上 开始以为可以将每个人能够打败的存起来 然后回溯法,妥妥t了 看题解发现,我们根本不需要回溯,画图发现,只要一直走去,根本不需要回溯 */ const int maxn = 1e3 + 10; char s[maxn][maxn]; vector<int>G[maxn]; int flag=0; int num[maxn]; int visit[maxn]; int n; int t; void dfs(int pos) { if(t==n){ flag=1; return; } if(flag) return; int len=G[pos].size(); for(int i=0;i<len;i++) { int v=G[pos][i]; if(!visit[v]) { visit[v]=1; num[t++]=v; dfs(v); } } return; } int main() { scanf("%d",&n); for(int i=0; i<n; i++) { scanf("%s",s[i]); for(int j=0; j<n; j++) if(s[i][j]=='1') G[i].push_back(j); } visit[0]=1; num[0]=0; t=1; dfs(0); if(flag) { for(int i=n-1;i>=1;i--) printf("%d ",num[i]); printf("0\n"); } else printf("impossible\n"); return 0; }