POJ
来源:互联网 发布:网络对人们的好处 编辑:程序博客网 时间:2024/06/08 08:59
点击查看原文
9X9方格数独填数,主要就是9个3X3小方格的bool查重数组的设计, 这里利用 (i-1)/3,(j-1)/3的方式把小方格的点的向量合并成一个向量,再利用3进制的移位操作变换成线性,如此九个3x3小方格也能和行列一样查重了。
代码基本没变,在原文的基础上加了点注释,毕竟本人ACM菜鸡QAQ
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int map[10][10],count1; //count1表示初始数独图中还空的位置 bool row[10][10],coloumn[10][10],cr[10][10];//用来标记行,竖,小方格已经填过了哪些数 struct p { int x,y; }point[100];//标记每个格子的横纵坐标 int cxbfine(int i,int j)//规定每个3*3方格的号码 { return ((i-1)/3)*3+(j-1)/3; // 这里是利用三进制数将一个二维向量映射到一维上 } int dfs(int n)//进行深搜,符合条件往下,填不下就回溯 { if(n>count1) return 1; for(int i=1;i<=9;i++) if(!row[point[n].x][i] && !coloumn[point[n].y][i] && !cr[cxbfine(point[n].x,point[n].y)][i]) { //处理,方便搜索的进行 row[point[n].x][i]=true; coloumn[point[n].y][i]=true; cr[cxbfine(point[n].x,point[n].y)][i]=true; map[point[n].x][point[n].y]=i; if(dfs(n+1)) return 1; //深搜 row[point[n].x][i]=false; coloumn[point[n].y][i]=false; cr[cxbfine(point[n].x,point[n].y)][i]=false; //如果搜索不成功,回溯的时候清除搜索痕迹 } return 0; } int main() { int n,i,j; cin>>n; while(n--) { count1=0; memset(row,false,sizeof(row)); memset(coloumn,false,sizeof(coloumn)); memset(cr,false,sizeof(cr)); for(i=1;i<=9;i++)//输入并判断 for(j=1;j<=9;j++) { scanf("%1d",&map[i][j]); if(map[i][j]) { row[i][map[i][j]]=true; coloumn[j][map[i][j]]=true; cr[cxbfine(i,j)][map[i][j]]=true; } else { count1++; point[count1].x=i; point[count1].y=j; } } dfs(1); for(i=1;i<=9;i++) { for(j=1;j<=9;j++) printf("%d",map[i][j]); //cout<<map[i][j]; printf("\n"); //cout<<endl; } } return 0; }
0 0
- POJ
- poj
- POJ
- POJ
- poj
- poj
- POJ
- POJ
- poj
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- Kibana 5.2 中文文档 | 片刻 ApacheCN(apache中文网)
- 并查集 POJ 1182 捕食链
- [WOJ26 Lost in WHU]矩阵快速幂
- Android图像处理整理
- 友盟多渠道打包 Android Apk
- POJ
- cocos2d-x cpp-test学习
- 在Ubuntu上用anaconda3安装opencv3
- 关于锚点和label的纯css内容切换
- HTML基本语法和语义
- 熄灯之后的学习——再读《MySQL必知必会》(3)
- 实用的好东西比较器
- 相邻区域染色最小染色数问题 POJ 1129
- JSP基本知识