给一个M*N的矩阵,矩阵元素均为0, 1 问是否可以选出一些行,使得这些行的每一行有且仅有一个1 例如 中的1, 4, 5行满足这个条件 这里的数据规模比较小,直接深度搜索就可以。 #include <stdio.h> #include <memory.h> bool mat[16][300]; bool ans, flag[300]; int n, m; void dfs(int depth) { if (ans) return; int i; if (depth >= m) { for (i=0; i<n; i++) if (!flag[i]) return; ans = true; return; } //不选择当前行 dfs(depth+1); if (ans) return; //选择当前行 bool tmp[300]; memcpy(tmp, flag, sizeof(tmp)); //保存状态 for (i=0; i<n; i++) { if ((int)flag[i] + (int)mat[depth][i]==1) flag[i] = true; else if (flag[i] && mat[depth][i]) { memcpy(flag, tmp, sizeof(tmp)); return; } } dfs(depth+1); memcpy(flag, tmp, sizeof(tmp)); //恢复状态 } int main() { int i, j, k; //freopen("data.txt", "r", stdin); while (scanf("%d%d", &m, &n)!=EOF) { memset(flag, 0, sizeof(flag)); for (i=0; i<m; i++) for (j=0; j<n; j++) { scanf("%d", &k); mat[i][j] = (bool)(k); flag[j] |= mat[i][j]; } for (i=0; i<n; i++) if (!flag[i]) break; if (i!=n) { printf("It is impossible/n"); continue; } memset(flag, 0, sizeof(flag)); ans = false; dfs(0); if (ans) printf("Yes, I found it/n"); else printf("It is impossible/n"); } }