您的位置:首页 > 其它

POJ2676

2015-10-05 15:03 381 查看
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;

short rowFlags[9][10];//rowFlags[i][num]=1表示在第i行已经放了数字num
short colFlags[9][10];//colFlags[j][num]=1表示在第j列已经放了数字num
short blockFlags[9][10];//blockFlags[k][num]=1表示在第k个小块已经放了数字num
int board[9][9];//整个棋盘

struct Pos{
int r,c;
Pos(int rr,int cc):r(rr),c(cc){}
};

vector<Pos> blankPos;//所有空白格的位置

inline int GetBlockNum(int r,int c){//由行,列号求小块号
int rr=r/3;
int cc=c/3;
return rr*3+cc;
}

void SetAllFlags(int i,int j,int num,int f){
//把num放在(i,j)位置,设置相应标记,或从(i,j)取走num,清除相应标记
rowFlags[i][num]=f;
colFlags[j][num]=f;
blockFlags[GetBlockNum(i,j)][num]=f;
}

bool IsOk(int i,int j,int num){
return !rowFlags[i][num] && !colFlags[j][num] && !blockFlags[GetBlockNum(i,j)][num];
}

bool Dfs(int n){
if(n<0){
return true;
}
int r=blankPos
.r;
int c=blankPos
.c;
for(int num=1;num<=9;num++){
if(IsOk(r,c,num)){
board[r][c]=num;
SetAllFlags(r,c,num,1);
if(Dfs(n-1)){
return true;
}
SetAllFlags(r,c,num,0);
}
}
return false;
}

int main(){
int t;
cin>> t;
while(t--){
memset(rowFlags,0,sizeof(rowFlags));
memset(colFlags,0,sizeof(colFlags));
memset(blockFlags,0,sizeof(blockFlags));
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]){//not 0
SetAllFlags(i,j,board[i][j],1);//标记
}else{// is 0
blankPos.push_back(Pos(i,j));// 加入blankPos
}
}
}

if(Dfs(blankPos.size()-1)){//倒序搜索
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
cout<<char(board[i][j]+'0');
}
cout<<endl;
}
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: