您的位置:首页 > 其它

delightful world--计蒜客(DFS)

2016-04-25 19:24 399 查看
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

;
int c
,a
;
char ch
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: