天梯赛 球队“食物链”

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

 

posted @ 2020-10-04 13:19  TRTTG  阅读(186)  评论(0编辑  收藏  举报