1. 程式人生 > 實用技巧 >天梯賽 球隊“食物鏈”

天梯賽 球隊“食物鏈”

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]); } }