POJ-2676-Sudoku: DFS 剪枝 回溯

// 思路请点这里
#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; }

 

你可能感兴趣的:(sudo)