POJ 3740(DFS)

POJ 3740(DFS)

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 > ||  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 

你可能感兴趣的:(POJ 3740(DFS))