首页 > 其他 > 详细

POJ-2676-Sudoku: DFS 剪枝 回溯

时间:2015-07-21 12:35:36      阅读:182      评论:0      收藏:0      [点我收藏+]
// 思路请点这里
#include<iostream> #include<cstring> #include<vector> using namespace std; int board[9][9]; // 棋盘 int RowFlag[9][10]; // RowFlag[i][j]=1 表示 在 第i行 已经放了数字 j int ColFlag[9][10]; // ColFlag[i][j]=1 表示 在第 i列 已经放了数字 j int BlockFlag[9][10]; // 同理 第 i 块 已经放了数字 j struct Node { int x, y; Node( int xx, int yy ) : x(xx), y(yy){}// Q1 结构体中构造函数? 不加分号? }; vector<Node> BlankPos; //存放所有空白处的位置 inline int GetBlockNum( int a, int b )// Q2 why inline ? { return 3*(a/3)+b/3; } void SetFlags(int i, int j, int num, int flag ) { RowFlag[i][num] = ColFlag[j][num] = BlockFlag[GetBlockNum(i, j)][num] = flag; } bool IsOk( int i, int j, int num ) { return !RowFlag[i][num] && !ColFlag[j][num] && !BlockFlag[GetBlockNum(i,j)][num]; } bool DFS( int n ) { if( n==BlankPos.size() ) return true; int r = BlankPos[n].x; int c = BlankPos[n].y; for( int i=1; i<10; i++ ) if( IsOk( r, c, i ) ){ board[r][c] = i; SetFlags( r, c, i, 1 ); if( DFS(n+1) ) return true; SetFlags( r, c, i, 0 ); // 回溯 } return false; } int main() { int T; cin>>T; while( T-- ) { memset( RowFlag, 0, sizeof( RowFlag ) ); memset( ColFlag, 0, sizeof( ColFlag ) ); memset( BlockFlag, 0, sizeof( BlockFlag ) ); BlankPos.clear(); for( int i=0; i<9; i++ ) for( int j=0; j<9; j++ ){ char c; cin>>c; board[i][j] = c-0; if( board[i][j] ) SetFlags( i, j, board[i][j], 1 ); else BlankPos.push_back( Node(i, j) ); } DFS( 0 ); for( int i=0; i<9; i++ ){ for( int j=0; j<9; j++ ) cout<<board[i][j]; cout<<endl; } } return 0; }

 

POJ-2676-Sudoku: DFS 剪枝 回溯

原文:http://www.cnblogs.com/FightForCMU/p/4663867.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!