hdu 4068 福州赛区网络赛H 排列 ***

拍的太慢了,很不满意

排完序之后,枚举自己和对手状态,若被击败,则再枚举自己下一个策略,直到可以击败对手所有的策略

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
using namespace std;
#define MOD 1000000007
const int INF=0x3f3f3f3f;
const double eps=1e-5;
typedef long long ll;
#define cl(a) memset(a,0,sizeof(a))
#define ts printf("*****
");
const int MAXN=1005;
int n,m,tt;
int g[15][15];
int a1[15]={0,1,2,3,4,5,6};
int a2[15]={0,1,2,3,4,5,6};
bool check()
{
    int t1=0;
    int t2=0;
    bool flag=0;
    while(1)
    {
        if(g[a2[t2]][a1[t1]])
        {
            t1++;
        }
        else t2++;
        if(t1==n)
        {
            flag=0;
            break;
        }
        if(t2==n)
        {
            flag=1;
            break;
        }
    }
    if(!flag)    return 0;
    else return 1;
}
int main()
{
    int i,j,k,ca=1;
    #ifndef ONLINE_JUDGE
    freopen("1.in","r",stdin);
    #endif
    scanf("%d",&tt);
    while(tt--)
    {
        printf("Case %d: ",ca++);
        map<string,int> mp1;
        map<int,string> mp2;
        scanf("%d",&n);
        string s[15];
        for(i=0;i<n;i++)
        {
            cin>>s[i];
        }
        sort(s,s+n);
        for(i=0;i<n;i++)
        {
            mp1[s[i]]=i;
            mp2[i]=s[i];
        }
        cl(g);
        string sw;
        for(i=0;i<n;i++)
        {
            int num;
            scanf("%d",&num);
            for(j=0;j<num;j++)
            {
                cin>>sw;
                int v=mp1[sw];
                g[i][v]=1;  //有克制关系
            }
        }
        for(i=0;i<15;i++)    a1[i]=i,a2[i]=i;
        bool flag=1;
        bool w=0;
        while(1)
        {
            flag=1;
            while(1)
            {
                if(!check())    //该策略被击败
                {
                    flag=0;
                }
                if(!next_permutation(a2,a2+n))  break;
            }
            if(flag)
            {
                w=1;
                break;
            }
            if(!next_permutation(a1,a1+n))  break;
        }
        if(w)
        {
            printf("Yes
");
            cout<<mp2[a1[0]];
            for(i=1;i<n;i++)
            {
                cout<<" "<<mp2[a1[i]];
            }
            printf("
");
        }
        else
        {
            printf("No
");
        }
    }
}
原文地址:https://www.cnblogs.com/cnblogs321114287/p/4721626.html