poj--2676--回溯

很久很久前 就做过数独了 当时一直没做出来了

这次 也磕磕绊绊 终于过了.... 数独题 真的很好 对于回溯的理解 很有帮助

一下子 觉得 全垒打的节奏...

        touch  me

  1 #include <iostream>
  2 #include <cstring>
  3 using namespace std;
  4 
  5 const int size = 15;
  6 bool flag;
  7 int sudu[size][size];
  8 bool rowHas[size][size];
  9 bool colHas[size][size];
 10 
 11 void dfs( int u )
 12 {
 13     bool end = false;
 14     int x = u/9;
 15     int y = u%9;
 16     if( u==81 )
 17     {
 18         flag = true;
 19         return;
 20     }
 21     if( sudu[x][y] )
 22     {
 23         dfs( u+1 );    
 24     }    
 25     else
 26     {
 27         for( int i = 1 ; i<=9 ; i++ )
 28         {
 29             if( rowHas[x][i] )
 30             {
 31                 continue;
 32             }
 33             else if( colHas[y][i] )
 34             {
 35                 continue;
 36             }
 37             else
 38             {
 39                 int xx = u/9/3*3;
 40                 int yy = u%9/3*3;
 41                 for( int j = xx ; j<xx+3 ; j++ )
 42                 {
 43                     for( int k = yy ; k<yy+3 ; k++ )
 44                     {
 45                         if( sudu[j][k] == i )
 46                         {
 47                             end = true;
 48                             break;
 49                         }
 50                     }
 51                     if( end )
 52                         break;
 53                 }        
 54             }
 55             if( end )
 56             {
 57                 end = false;
 58                 continue;
 59             }
 60             sudu[x][y] = i;
 61             rowHas[x][i] = true;
 62             colHas[y][i] = true;
 63             dfs( u+1 );
 64             if( flag )
 65             {
 66                 return;
 67             }
 68             rowHas[x][i] = false;
 69             colHas[y][i] = false;
 70             sudu[x][y] = 0;
 71         }
 72     }
 73 }
 74 
 75 int main()
 76 {
 77     int n;
 78     char ch;
 79     while( cin >> n )
 80     {
 81         while(n--)
 82         {
 83             flag = false; 
 84             memset( rowHas , false , sizeof(rowHas) );
 85             memset( colHas , false , sizeof(colHas) );
 86             for( int i = 0 ; i<9 ; i++ )
 87             {
 88                 for( int j = 0 ; j<9 ; j++ )
 89                 {
 90                     cin >> ch;
 91                     sudu[i][j] = ch-'0';
 92                     if( sudu[i][j] )
 93                     {
 94                         rowHas[i][ sudu[i][j] ] = true;    
 95                         colHas[j][ sudu[i][j] ] = true;
 96                     }
 97                 }
 98             }
 99             dfs( 0 );
100             for( int i = 0 ; i<9 ; i++ )
101             {
102                 for( int j = 0 ; j<9 ; j++ )
103                 {
104                     cout << sudu[i][j];
105                 }
106                 cout << endl;
107             }
108         }
109     }    
110     return 0;
111 }
View Code

 

today:

  十年前 我要生如夏花

  十年后 我要平凡一生

转载于:https://www.cnblogs.com/radical/p/3852520.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值