0
点赞
收藏
分享

微信扫一扫

7-15 球队“食物链” (30 分)

程序小小黑 2022-04-05 阅读 61
c++

题目链接
题意:就是找一个环,使环上的每一个点都有赢下一个点的情况。
就是一个dfs+剪枝,剪枝就是每个点都要判断一下能否有一个点能够赢第一个点,但判断的时候要在还剩一个点的时候,这样讲可能有点抽象,下面是超时一个点代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
char c[25][25];
vector<int> ans;
vector<int> win[25];
vector<int> cop;
bool st[25];
int cou=0;
int n;
int ma[30][30];
bool fail[25];
void dfs(int u)
{
    int i;
    for(i=2; i<=n; i++)
    {
        if(!st[u]&&ma[i][1]==1)
        {
            break;
        }
    }
    if(i==n+1) return ;
    cop.push_back(u);
    st[u]=true;
    if(cop.size()==n&&cou==0)
    {
        int flag=0;
        int k=win[cop[n-1]].size();
        for(int i=0; i<k; i++)
        {
            if(win[cop[n-1]][i]==cop[0])
            {
                for(i=0; i<cop.size(); i++)
                {
                    ans.push_back(cop[i]);
                }
                flag=1;
                break;
            }
        }
        if(flag==1)
        {
            for(int i=0; i<ans.size(); i++)
            {
                if(i==ans.size()-1) cout<<ans[i]<<endl;
                else cout<<ans[i]<<" ";
            }
            exit(0);
        }
    }
    for(int i=0; i<win[u].size(); i++)
    {
        int x=win[u][i];
        if(!st[x])
        {
            dfs(x);
        }
    }
    st[u]=false;
    cop.pop_back();
}
int main()
{

    cin>>n;
    for(int i=1; i<=n; i++)
    {
        cin>>c[i]+1;
    }
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=n; j++)
        {
            if(c[i][j]=='-') continue;
            else if(c[i][j]=='W')
            {
                ma[i][j]=1;
                int flag=0;
                for(int k=0; k<win[i].size(); k++)
                {
                    if(win[i][k]==j)
                    {
                        flag=1;
                        break;
                    }
                }
                if(flag==0) win[i].push_back(j);
            }
            else if(c[i][j]=='L')
            {
                ma[j][i]=1;
                int flag=0;
                for(int k=0; k<win[j].size(); k++)
                {
                    if(win[j][k]==i)
                    {
                        flag=1;
                        break;
                    }
                }
                if(flag==0)
                {
                    win[j].push_back(i);
                }
            }
        }
    }
    for(int i=1; i<=n; i++) sort(win[i].begin(),win[i].end());
    dfs(1);
    if(ans.size()==0) cout<<"No Solution"<<endl;
    return 0;
}


exit(0)就是直接退出,也可以在退出递归后在输出。

举报

相关推荐

0 条评论