天梯賽 球隊“食物鏈”
阿新 • • 發佈:2020-10-04
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; intm; 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]); } }