http://acm.pku.edu.cn/JudgeOnline/problem?id=3740
这道题目要求:选出一些行使得这些行构成矩阵的每一列都有且只有一个1。
1 #include<cstdio>
2 #include<string.h>
3 using namespace std;
4
5 int m,n,map[16][300];
6 bool used[300];
7 bool find;
8
9 bool match(){ //判断所选取的行构成的矩阵是否符合情况
10 for(int i = 0;i < n;++i){
11 if(!used[i])return false;
12 }
13 return true;
14 }
15
16 bool check(int row){
17 for(int i = 0;i < n;++i){
18 if(used[i] && map[row][i])return false; //used[i]&&map[row][i]表示该列有选取的该列有不只一个1,返回false放弃这种情况。
19 }
20 for(int i = 0;i < n;++i){
21 if(map[row][i]){
22 used[i] = true;
23 }
24 }
25 return true;
26 }
27
28 void dfs(int start){
29 if(start>m || find)return;
30 if(match()){
31 printf("Yes, I found it\n");
32 find = true;
33 return;
34 }
35 for(int i = start;i < m && !find;++i){
36 if(check(i)){
37 dfs(i+1);
38 for(int j = 0;j < n;++j){
39 if(map[i][j])used[j] = false;
40 }
41 }
42 }
43 }
44
45 int main()
46 {
47 int i,j;
48 while(scanf("%d%d",&m,&n)!=EOF){
49 for(i = 0;i < m;++i){
50 for(j = 0;j < n;++j){
51 scanf("%d",&map[i][j]);
52 }
53 }
54 memset(used,false,sizeof(used));
55 find = false;
56 dfs(0);
57 if(!find)printf("It is impossible\n");
58 }
59 return 0;
60 }
61