37. Sudoku Solver
2016-04-26 10:17
281 查看
//回溯法解 //注意递归终止条件,一个是递归到点(8,8)而且该点为数字,另一个是递归到该点,该点处为‘.’,而且可以放置数字。 //cout<<bitset<sizeof(int)*8>(r[i][j])<<" "; 二进制输出 class Solution { public: void find_result(int r[3][9],vector<vector<char>>& b,int x,int y,bool & flag) { if(x==9) return; for(int i=x;i<9;i++) { for(int j=(i==x?y:0);j<9;j++) { if(b[i][j]=='.') { for(int k=0;k<9;k++) { if(r[0][i]&(1<<k)||r[1][j]&(1<<k)||r[2][i/3*3+j/3]&(1<<k)) continue; if(i==8&&j==8) flag=true; b[i][j]='1'+k; r[0][i]|=(1<<k); r[1][j]|=(1<<k); r[2][i/3*3+j/3]|=(1<<k); find_result(r,b,i,j+1,flag); if(flag) return; r[0][i]&=~(1<<k); r[1][j]&=~(1<<k); r[2][i/3*3+j/3]&=~(1<<k); } b[i][j]='.'; return; } else if(i==8&&j==8) flag=true; if(flag) return; } } } void solveSudoku(vector<vector<char>>& b) { int r[3][9]={0}; for(int i=0;i<9;i++) { for(int j=0;j<9;j++) { if(b[i][j]!='.') { int k=b[i][j]-'1'; r[0][i]|=(1<<k); r[1][j]|=(1<<k); r[2][i/3*3+j/3]|=(1<<k); } } } bool falg=false; find_result(r,b,0,0,falg); } };
相关文章推荐
- MySql为何默认不用hash索引而用BTree索引的几点原因
- android轻松管理安卓应用中的log日志 发布应用时log日志全部去掉的方法
- map展示当前位置,并实时以当前位置为中心显示
- Java基础知识IO流(装饰设计模式)
- colors
- 设计模式笔记:装饰模式
- 状态机
- Android自定义标尺控件RulerView
- android studio 中导入 已经建好的aidl
- 忽略编译警告
- Win7修改保存Hosts提示没有管理员权限的解决办法
- 利用正则表达式排除特定字符串
- 经典Sql语句
- H5知识点大总结勾起你的欲望
- 轮询和长轮询
- 4月第3周B2B网站覆盖数排名TOP15:阿里巴巴第一
- 母函数算法入门
- Android Native 代码开发学习笔记
- AutoLoadCache 与 Spring Cache 的区分
- 将中文转换成URL编码