首页 > 其他 > 详细

HDU 4068

时间:2014-04-16 09:07:55      阅读:462      评论:0      收藏:0      [点我收藏+]

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

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

bubuko.com,布布扣
#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 4068,布布扣,bubuko.com

HDU 4068

原文:http://www.cnblogs.com/xiaohongmao/p/3667725.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!