HDU 4068

http://acm.hdu.edu.cn/showproblem.php?pid=4068

暴力枚举两个全排列,犯了若干错误,以此为鉴

#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
using namespace std ;
int n,f,m[10],vis[10],vis2[10],temp[10] ;
string str[10],ans[10],s[10][10],res[10] ;
int OK()
{
    int i,j,flag ;
    i=j=0 ;
    while(i<n && j<n)
    {
        flag=0 ;
        for(int k=0 ;k<m[temp[i]] ;k++)
        {
            if(s[temp[i]][k]==res[j])
            {
                flag=1 ;
                break ;
            }
        }
        if(flag)j++ ;
        else i++ ;
    }
    if(i==n)return 1 ;
    return 0 ;
}
int ff ;
int dfs2(int cur)
{
    if(cur==n)
    {
        if(!OK()){
            ff=0 ;
            return 0 ;
        }
    }
    for(int i=0 ;i<n && ff ;i++)
    {
        if(!vis2[i])
        {
            vis2[i]=1 ;
            temp[cur]=i ;
            dfs2(cur+1) ;
            vis2[i]=0 ;
        }
    }
    if(ff)return 1 ;
    return 0 ;
}
void dfs(int cur)
{
    if(f)
        return ;
    if(cur==n)
    {
        ff=1 ;
        memset(vis2,0,sizeof(vis2)) ;
        if(dfs2(0))
        {
            f=1 ;
            for(int i=0 ;i<n ;i++)
                ans[i]=res[i] ;
        }
        return ;
    }
    for(int i=0 ;i<n ;i++)
    {
        if(!vis[i])
        {
            vis[i]=1 ;
            res[cur]=str[i] ;
            dfs(cur+1) ;
            vis[i]=0 ;
        }
    }
}

int main()
{
    int t ;
    scanf("%d",&t) ;
    for(int cas=1 ;cas<=t ;cas++)
    {
        scanf("%d",&n) ;
        for(int i=0 ;i<n ;i++)
            cin >> str[i] ;
        for(int i=0 ;i<n ;i++)
        {
            scanf("%d",&m[i]) ;
            for(int j=0 ;j<m[i] ;j++)
            {
                cin >> s[i][j] ;
            }
        }
        sort(str,str+n) ;
        f=0 ;
        memset(vis,0,sizeof(vis)) ;
        dfs(0) ;
        printf("Case %d: ",cas) ;
        if(f)
        {
            puts("Yes") ;
            for(int i=0 ;i<n ;i++)
            {
                if(i)
                {
                    putchar(' ') ;
                }
                cout << ans[i] ;
            }
            putchar('
') ;
        }
        else
            puts("No") ;
    }
    return 0 ;
}
View Code
原文地址:https://www.cnblogs.com/xiaohongmao/p/3667725.html