【题目描述】
选出一些行使得这些行构成矩阵的每一列都有且只有一个1。
【接替思路】
直接判断每一行是否选中。
此方法并不高效。
int m, n;
int Map[16][300];
bool used[300];
bool Find;
bool match()//判断所选取的行是否让每一列都恰好有一个1
{
int i;
for (i = 0; i < n; ++i)
if (used[i] == 0)
return false;
return true;
}
bool check(int row)
{
int i;
for (i = 0; i < n; ++i) {
if (used[i] == true && Map[row][i] == 1) {
return false;
}
}
for (i = 0; i < n; ++i) {
if (Map[row][i])
used[i] = true;
}
}
void dfs(int index)
{
int i, j;
if (index > m || Find == true) return ;
if (match()) {
Find = true;
return ;
}
for (i = index; i < m && !Find; ++i) {
if (check(i)) {
dfs(i + 1);
for (j = 0; j < n; ++j)
if (Map[i][j])
used[j] = false;
}
}
}
int main()
{
int i, j;
while (scanf("%d%d", &m, &n) == 2) {
for (i = 0; i < m; ++i) {
for (j = 0; j < n; ++j) {
scanf("%d", &Map[i][j]);
}
}
memset(used, false, sizeof(used));
Find = false;
dfs(0);
if (Find) {
printf("Yes, I found it\n");
} else {
printf("It is impossible\n");
}
}
return 0;
}