POJ3740精确覆盖(dfs +状压+位运算)

来源:互联网 发布:破解版的软件 编辑:程序博客网 时间:2024/06/06 09:23

// 212K 235ms#include <iostream>#include <cstdio>#include <cstring>using namespace std;struct data{int cnt;unsigned __int64 a[5];void date(){cnt = 0;memset(a,0,sizeof a);}}bt[17];int aa,m,n;bool dfs(int pos,data jtu){if(jtu.cnt == n) return true;if(pos==m) return false; if(dfs(pos+1,jtu)) return true;data jtu_tmp = jtu;int i;for(i=0;i<5;i++){if((jtu_tmp.a[i]&bt[pos].a[i])==0) jtu_tmp.a[i] ^=  bt[pos].a[i];else break;}if(i!=5) return false;jtu_tmp.cnt += bt[pos].cnt; if(dfs(pos+1,jtu_tmp)) return true;return false;}int main(){while(cin>>m>>n){for (int i=0;i<m;i++){bt[i].date();for (int j=0;j<n;j++){scanf("%1d",&aa);if(aa==1) {bt[i].a[j/64] ^= 1LL<<(j>64?j%64:j);bt[i].cnt++;}}}data jtc;jtc.date();if(dfs(0,jtc)) cout<<"Yes, I found it\n";else cout<<"It is impossible\n";}return 0;}



这样子写,要对位运算比较熟练才能写,然后我利用了一点,就是 a&b ==0 说明a b在同一个二进制位上不会有相同的1,所以a&b==0的时候可以继续往下穷举。然后基本上就是这样子了




0 0
原创粉丝点击