天梯赛 球队“食物链”
https://pintia.cn/problem-sets/994805046380707840/problems/994805048175869952
搜索,状压判重
f[s][i]:状态为s,i为最后一个
用f记录某个状态是不是已经不合法了
因为对于一个有x位的状态t,确定好最后一个,有(x-1)!种方式搜索的这一状态
因为只有最后一个才会影响后面,所以他们的后效性都是一样的
#include<cstdio> using namespace std; int n,full; char s[21][21]; int ans[21]; int f[1100000][20]; bool tag; int m; void dfs(int first,int now,int state) { if(state==full) { if(s[now][first]!='W' && s[first][now]!='L') { f[state][now]=-1; return; } tag=true; ans[++m]=now; return; } f[state][now]=1; int ns; for(int i=1;i<=n;++i) if(!(state&(1<<i-1))) { if(s[now][i]=='W' || s[i][now]=='L') { ns=state|(1<<i-1); if(f[ns][i]==-1) continue; dfs(first,i,ns); if(!tag) f[ns][i]=-1; else { ans[++m]=now; return; } } } } int main() { scanf("%d",&n); full=(1<<n)-1; for(int i=1;i<=n;++i) scanf("%s",s[i]+1); for(int i=1;i<=n && !tag;++i) dfs(i,i,1<<i-1); if(!tag) printf("No Solution"); else { for(int i=m;i>1;--i) printf("%d ",ans[i]); printf("%d",ans[1]); } }