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('\n') ;

        }

        else

            puts("No") ;

    }

    return 0 ;

}
View Code

 

你可能感兴趣的:(HDU)