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; } } } }
相关文章推荐
- 手工创建mfc程序的几个步骤
- Sicily 1732 Alice and Bob (二进制最大公约数)
- 第九讲:HTML5该canvas推箱子原型实现
- (转)JAVA反射机制理解
- Python 常见语法错误
- Course Schedule II
- swift 设计模式---委托(delegate)模式传值
- OJ的搭建
- TF-IDF算法-Python实现(附源代码)
- Android基础学习之消息发送使用Looper
- 个人信念,坚持独立自主的判断,朋友之间的买卖让人难为情
- 黑马程序员——java学习笔记--集合框架
- 个人信念,坚持独立自主的判断,朋友之间的买卖让人难为情
- 个人信念,坚持独立自主的判断,朋友之间的买卖让人难为情
- border属性妙用
- Java八个并发学习——线程同步工具CyclicBarrier
- Ubuntu14.04下安装Hadoop2.4.0 (单机模式)
- dedecms修改面包屑导航
- 黑马程序员——Java学习笔记--IO流
- 程序员和工程师有什么不一样?