L3-015 球队“食物链”(全排列DFS剪枝)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/leekerian/article/details/88901190

复习了一下dfs写全排列

#include <iostream>

using namespace std;

int vis[10];
int ans[10];
void dfs(int num)
{
    if(num>5)
    {
        for(int i=1;i<=5;i++)
            cout<<ans[i]<<" ";
        cout<<endl;
        return;
    }
    for(int i=1;i<=5;i++)
    {
        if(!vis[i])
        {
            ans[num]=i;
            vis[i]=1;
            dfs(num+1);
            vis[i]=0;
        }
    }
}
int main()
{
    dfs(1);
    return 0;
}

用vis标记有没有访问过然后dfs

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

int str[22][22];
char map[22][22];
int ans[22];
int vis[22];
int n;
int flag;
bool dfs(int k,int be)
{
    if(k>n)
    {
         if(str[ans[k-1]][ans[1]]==1)
         {
            flag=1;
            for(int i=1;i<=n;i++)
            {
                if(i==1) printf("%d",ans[i]);
                else printf(" %d",ans[i]);
            }
            printf("\n");
            return true;
         }
         return false;
    }
    bool ans1;
    bool cut=false;
    for(int i=1;i<=n;i++)
        if(!vis[i]&&str[i][1]==1&&i!=1)
            cut=true;
    if(!cut) return false;
    for(int i=1;i<=n;i++)
    {
        if(!vis[i]&&str[be][i]==1)
        {
            ans[k]=i;
            vis[i]=1;
            ans1=dfs(k+1,i);
            if(ans1)
                break;
            vis[i]=0;
        }
    }
    return ans1;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        getchar();
        for(int j=1;j<=n;j++)
        {
            char c;
            scanf("%c",&c);
            if(c=='W'||c=='-')
                str[i][j]=1;
            else if(c=='L')
                str[j][i]=1;
        }
    }
    flag=0;
    dfs(1,1);
    if(!flag)
        printf("No Solution\n");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/leekerian/article/details/88901190