leetcode 36

感觉就是遍历。

保存好状态,就是各行各列还有各分区divide的情况

用数组做。

空间小时间大

class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
int row[9][9]={0},col[9][9]={0},div[9][9]={0};
int temp=0,dnum;
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
if(board[i][j]!='.'){
temp=board[i][j]-'0'-1;
row[i][temp]++;
col[j][temp]++;
dnum=(i/3)*3+j/3;
div[dnum][temp]++;
if(row[i][temp]==2||col[j][temp]==2||div[dnum][temp]==2)
return false;
}
}
}
return true;
}
};

然后

学到了用unordered_set  unordersd_map加速。

空间大时间小

class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
vector<unordered_set<int>> row(9), col(9), block(9);
for(int i = 0; i < 9; ++ i){
for(int j = 0; j < 9; ++ j){
int bindex = (i / 3)* 3 + j / 3;
char cur = board[i][j];
if(cur == '.') continue;
if(row[i].count(cur) || col[j].count(cur) || block[bindex].count(cur)) return false;
row[i].insert(cur);
col[j].insert(cur);
block[bindex].insert(cur);
}
}
return true;
}
};

leetcode 37

做之前还百度了一下有没有解数独的技巧。。。  OxO

上一道题保存了行列块的状态,这里也可以保留,保留的不再是出现与否而是可用数字

回溯就完事了

class Solution {
public:
vector<unordered_set<int>> row, col, block;
void solveSudoku(vector<vector<char>>& board) {
// 预处理,初始状态
int t=0;
unordered_set<int> tp={1,2,3,4,5,6,7,8,9};
for(int i=0;i<9;i++)
{row.push_back(tp);col.push_back(tp);block.push_back(tp);}
for( int i = 0; i < 9; i++)
for( int j = 0; j < 9; j++)
if( board[i][j] != '.'){
t = board[i][j] - '0';
row[i].erase(t), col[j].erase(t), block[(i/3)*3 + j/3].erase(t);
}
int flag=0;
dfs(board,0,flag);
if(flag==0) //题目说明有唯一解,不会出现
cout<<"wrong"<<endl;
} bool check(vector<vector<char>>& board,int i,int j,int num){
if(row[i].find(num)!= row[i].end()&& col[j].find(num) != col[j].end()
&& block[(i/3)*3 + j/3].find(num) != block[(i/3)*3 + j/3].end())
return true;
return false;
} void dfs(vector<vector<char>>& board,int cnt,int &flag){
if( cnt == 81){
flag = 1;
return ;
}
int i = cnt / 9, j = cnt % 9;
if( board[i][j] == '.'){
for( int k = 1; k < 10; k++)
if(check(board, i, j, k)){
row[i].erase(k), col[j].erase(k), block[(i/3)*3 + j/3].erase(k);
board[i][j] = '0'+k;
dfs(board, cnt+1,flag);
if(flag)
return;
else{
row[i].insert(k), col[j].insert( k), block[(i/3)*3 + j/3].insert(k);
board[i][j] = '.';
}
}
else
continue;
}
else
dfs(board, cnt+1,flag);
return ;
}
};

然后效率很差。。时间和空间上

改成数组

class Solution {
public:
int row[10][10], col[10][10], block[10][10];
void solveSudoku(vector<vector<char>>& board) {
// 预处理,初始状态
int t=0;
for( int i = 0; i < 9; i++)
for( int j = 1; j < 10; j++)
{
row[i][j]=0, col[i][j]=0, block[i][j]=0;
}
for( int i = 0; i < 9; i++)
for( int j = 0; j < 9; j++)
if( board[i][j] != '.'){
t = board[i][j] - '0';
row[i][t]=1, col[j][t]=1, block[(i/3)*3 + j/3][t]=1;
}
int flag=0;
dfs(board,0,flag);
if(flag==0) //题目说明有唯一解,不会出现
cout<<"wrong"<<endl;
} void dfs(vector<vector<char>>& board,int cnt,int &flag){
if( cnt == 81){
flag = 1;
return ;
}
int i = cnt / 9, j = cnt % 9;
if( board[i][j] == '.'){
for( int k = 1; k < 10; k++)
if(row[i][k]==0 && col[j][k]==0 && block[(i/3)*3 + j/3][k]==0){
row[i][k]=1, col[j][k]=1, block[(i/3)*3 + j/3][k]=1;
board[i][j] = '0'+k;
dfs(board, cnt+1,flag);
if(flag)
return;
else{
row[i][k]=0, col[j][k]=0, block[(i/3)*3 + j/3][k]=0;
board[i][j] = '.';
}
}
else
continue;
}
else
dfs(board, cnt+1,flag);
return ;
}
};

我好了

然后,不传引用而是copy可以再节省一点空间

然后剪枝,没考虑 OxO

最新文章

  1. js基础练习三之数码时钟
  2. Android ContentProvider介绍
  3. [Asp.net MVC]Asp.net MVC5系列——添加模型
  4. SSH框架总结(框架分析+环境搭建+实例源码下载) 《转》
  5. ICMP Internet控制报文协议
  6. 又是一个二模02,不过day2
  7. Why does my ListView scroll to the top when navigating backwards?
  8. 配置phpmyadmin使登录时可填写IP管理多台MySQL 连接多个数据库 自动登录
  9. Java [leetcode 10] Regular Expression Matching
  10. (转)ThinkPHP使用心得分享-分页类Page的用法
  11. AfxMessageBox(&quot;这里为提示框的内容&quot;);程序弹出一个提示窗口,可以做调试提示信息
  12. 关于NotePad++ v1.0的编译和源码分析
  13. 最长递增子序列(Longest Increase Subsequence)
  14. asp.net在类库中使用EF 6.0时的相关配置
  15. python3 字典(dictionary)(一)
  16. 全网最全的Windows下Anaconda2 / Anaconda3里正确下载安装爬虫框架Scrapy(离线方式和在线方式)(图文详解)
  17. 十大经典排序算法详细总结(含JAVA代码实现)
  18. Linux 查找文件命令 find whereis locate
  19. 基于MVC 的Quartz.Net组件实现的定时执行任务调度
  20. linux中tomcat修改错误日志路径

热门文章

  1. 实操|如何将 Containerd 用作 Kubernetes runtime
  2. Windows+.Net Framework+svn+IIS在Jenkins上的自动化部署入门
  3. 2V升3V芯片,输入2V输出3V可达1A
  4. PAT练习num3-跟奥巴马一起学编程
  5. pycharm安装完成后的一些基本设置
  6. Dubbo 最基本的几个需求
  7. 不占用额外内存空间能否做到 将图像旋转90度 N &amp;#215; N矩阵表示的图像,其中每个像素的大小为4字节
  8. 腾讯libco协程原理
  9. CSS(简介or选择器)
  10. Horde Groupware Webmail Edition 远程命令执行