题意:给出一个0-1矩阵,判断是否能从其中选择几行使得选出的行中每一列都有且仅有一个1。
分析:dfs , 此题也可以用Dancing Links 优化,因为是一道精确覆盖的题
普通搜索:
View Code
#include <cstdio> #include <cstring> #include <iostream> using namespace std; const int maxn = 18 , maxm = 303; int n , m; int a[maxn][maxm]; bool vis[maxm]; int ok; bool pan(int i) { for(int j=1;j<=m;j++) if(a[i][j] && vis[j]) return false; return true; } void panpan(int i) { for(int j=1;j<=m;j++) if(a[i][j]) vis[j] = 1; } void panpanpan(int i) { for(int j=1;j<=m;j++) if(a[i][j]) vis[j] = 0; } bool judge() { for(int i=1;i<=m;i++) if(!vis[i]) return false; return true; } void dfs(int i) { if(judge()) { ok = 1; return; } if(i > n) return; dfs(i+1); if(ok) return; if(pan(i)) { panpan(i); dfs(i+1); if(ok) return; panpanpan(i); } } int main() { while(~scanf("%d%d",&n,&m)) { memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&a[i][j]); ok = 0; dfs(1); if(ok) printf("Yes, I found it\n"); else printf("It is impossible\n"); } return 0; }
舞蹈链:
(暂缺)