delightful world--计蒜客(DFS)

http://nanti.jisuanke.com/t/11067

题目大意: 给你一个n和m  下面是m个字符串和k   每一字符串的长度是n  你要找一个串跟每一个串匹配  有k个字符是和这个串相等   让你求有多少个正确的串

他说  k最大是5   所以就直接枚举第一个串的正确的位置  然后跟其他的比较   枚举最大的也就是C(35,5)  32万多  

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
#include<math.h>
#include<queue>
#include<algorithm>
#include<iostream>

using namespace std;
#define N 50
const double ESP = 1e-8;
#define INF 0xffffffff
#define memset(a,b) memset(a,b,sizeof(a))

int n,m;
char maps[N][N];
int c[N],a[N];
char ch[N];
int ans=0;

int judge()
{
    for(int i=1; i<=m; i++)
    {
        int t=0;
        for(int j=1; j<=n; j++)
        {
            if(maps[i][j]==ch[j])
                t++;
        }
        if(t!=a[i])
            return false;
    }
    return true;
}

int ok()
{
    for(int i=1; i<=n; i++)
    {
        if(c[i]==1)
            ch[i]=maps[1][i];
        else if(maps[1][i]=='1')
            ch[i]='0';
        else
            ch[i]='1';
    }
    if(judge())
        return true;
    return false;
}

void DFS(int nn,int k)
{
    if(nn<k)
        return;
    if(k==0)
    {
        if(ok())
            ans++;
        return;
    }
    c[nn]=0;
    DFS(nn-1,k);
    c[nn]=1;
    DFS(nn-1,k-1);
    c[nn]=0;

}

int main()
{
    memset(a,0);
    memset(c,0);
    memset(maps,0);
    memset(ch,0);
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        memset(a,0);
        memset(c,0);
        memset(maps,0);
        memset(ch,0);
        for(int i=1; i<=m; i++)
        {
            scanf("%s %d",maps[i]+1,&a[i]);
        }
        ans=0;
        DFS(n,a[1]);
        printf("%d\n",ans);
    }
    return 0;
}

 

posted @ 2016-04-25 19:24  啦咯  阅读(201)  评论(0编辑  收藏  举报