L3-015. 球队“食物链”

除了一个剪枝,其他一切的都是dfs的常规操作


#include<bits/stdc++.h>

using namespace std;
const int maxn = 30;
char ar[maxn][maxn];
int N;
int  w[maxn][maxn];
bool vis[maxn];
int  ans[maxn];
bool dfs(int i,int num)
{
    if(num == N && w[i][0])
    {
        for(int k = 0; k < N; ++k)
        {
            if(k)
                cout<<' ';
            cout<<ans[k]+1;
        }
        return true;
    }


// 遍历,如果不能和0 形成环,就停止搜索
    int k;
    for( k = 1;k < N; ++k)
    {
        if(!vis[k] && w[k][0])
            break;
    }
    if(k >= N)
        return false;



    for(int j = 1; j < N; ++j)
    {
        if(!vis[j]&&w[i][j])
        {
            ans[num] = j;
            vis[j] = 1;
            if(dfs(j,num+1))
                return true;
            vis[j] = false;
        }
    }
    return false;
}

int main(void)
{
    ios::sync_with_stdio(false);
    cin>>N;
    for(int i = 0; i < N; ++i)
        cin>>ar[i];
    for(int i = 0; i < N; ++i)
    {
        for(int j = 0; j < N; ++j)
        {
            if(i == j)
                continue;
            if(ar[i][j] =='W')
                w[i][j] = 1;
            else if(ar[i][j] == 'L')
                w[j][i] = 1;
        }
    }
    vis[0] = 1;
    ans[0] = 0;
    if(!dfs(0,1))
        printf("No Solution");
    return  0;
}