POJ-3740(dfs边界点和还原处理)(Easy Finding)

来源:互联网 发布:ubuntu 32位下载 编辑:程序博客网 时间:2024/05/16 18:45

【题目描述】

选出一些行使得这些行构成矩阵的每一列都有且只有一个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;}


原创粉丝点击