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; }