leetcode第一刷_Sudoku Solver
这道题简直是耻辱啊。竟然被吓得不敢做,最终開始写还犯下了各种低级错误,花了好久的时间。
事实上假设想明确81*9事实上是非常小的规模的话,早就想到用回溯法了,这不是跟八皇后全然一样的嘛。每次填入的时候,验证一下合不合理,当中合不合理在上一个问题中已经讨论过了。对当前位置讨论更简单。
所的头头是道。你会问“那你是错在哪呢?”你猜啊。我在推断一个小方格时候合理时,走了非常多弯路。一開始想的是用循环和减法。找到当前位置所在的小方格最左上角的位置。事实上全然不用啊亲。当听到实验室的同学说3*(i/3)和3*(j/3)直接就是时。我眼泪都掉下来了。蠢爆了。还有。在推断board上的字符等不等于当前字符p时,我竟然写出了board[i][j]=='p'这样的惊天地泣鬼神的代码,给自己跪了。p传进去的就是字符格式了,在数独的棋盘上到哪找等于‘p’的位置啊。
。
class Solution {
public:
int MAX = 9;
bool flag = false;
bool isValide(vector<vector<char> > &board, char p, int i, int j){
for(int k=0;k<MAX;k++){
if(board[i][k] == '.') continue;
if(k!=j&&board[i][k] == p)
return false;
}
for(int k=0;k<MAX;k++){
if(board[k][j] == '.') continue;
if(k!=i&&board[k][j] == p)
return false;
}
int refi = 3*(i/3), refj = 3*(j/3);
for(int m=refi;m<refi+3;m++){
for(int n=refj;n<refj+3;n++){
if(m==i && n==j) continue;
if(board[m][n] == '.') continue;
if(board[m][n] == p)
return false;
}
}
return true;
} void fileSudo(vector<vector<char> > &board, int pos){
if(pos == 81) {flag = true; return;}
int i=pos/MAX, j=pos%MAX;
if(isdigit(board[i][j])){
fileSudo(board, pos+1);
}else{
for(char p='1';p<='9';p++){
//cout<<i<<" "<<j<<" "<<p<<endl;
if(isValide(board, p, i, j)){
board[i][j] = p;
//cout<<"nice p:"<<p<<endl;
fileSudo(board, pos+1);
if(flag) return;
}
}
board[i][j] = '.';
}
}
void solveSudoku(vector<vector<char> > &board) {
fileSudo(board, 0);
}
};
leetcode第一刷_Sudoku Solver的更多相关文章
- leetcode第一刷_Set Matrix Zeroes
这个题乍一看非常easy,实际上还挺有技巧的.我最開始的想法是找一个特殊值标记.遇到一个0,把他所相应的行列中非零的元素标记成这个特殊值.0值保持不变,然后再从头遍历一次,碰到特殊值就转化成0. 问题 ...
- leetcode第一刷_Permutations II
当有反复元素的时候呢? 不用拍脑袋都会想到一种方法,也是全部有反复元素时的通用处理方法,维护一个set,假设这个元素没增加过就增加,增加过了的忽略掉.可是,在这道题上这个通用方法竟然超时了! 怎么办? ...
- leetcode第一刷_Populating Next Right Pointers in Each Node II
很自然的推广,假设去掉全然二叉树的条件呢?由于这个条件不是关键,因此不会影响整体的思路.做法依旧是每次找到一层的起点,然后一层一层的走. 假设是全然二叉树的话,每层的起点就是上一层起点的左孩子,兄弟之 ...
- leetcode第一刷_Merge Intervals
看到这个题我就伤心啊,去微软面试的时候,第一个面试官让我做的题目就是实现集合的交操作,这个集合中的元素就像这里的interval一样.是一段一段的.当时写的那叫一个慘不忍睹.最后果然被拒掉了. .好好 ...
- leetcode第一刷_N-Queens
八皇后问题应该是回溯法的教学典范.在本科的时候,有一门课叫面向对象.最后的附录有这个问题的源码.当时根本不懂编程,照抄下来,执行一下出了结果都非常开心,哎. 皇后们的限制条件是不能同行同列,也不能同对 ...
- leetcode第一刷_Gray Code
说到格雷码,应该没人不知道,详细它有什么用,我还真不是非常清楚,我室友应该是专家.生成的规律不是非常明显,之前看到帖子讲的,这会儿找找不到了.. 思想是这种,假设有n位,在第2^(n-1)个编码以下画 ...
- leetcode第一刷_Combination Sum Combination Sum II
啊啊啊啊.好怀念这样的用递归保存路径然后打印出来的题目啊.好久没遇到了. 分了两种,一种是能够反复使用数组中数字的,一种是每一个数字仅仅能用一次的.事实上没有多大差别,第一种每次进入递归的时候都要从头 ...
- leetcode第一刷_Count and Say
水题. 描写叙述的还挺麻烦的,实际上就是纸老虎,用两个string,一个存上一轮的结果,一个用来更新出这一轮的结果,每次扫描上一轮,统计一个字符出现的次数,然后把这个次数和字符增加到这一轮的字符串中就 ...
- leetcode第一刷_Jump Game
这个题事实上非常easy的,我一開始想复杂了,它没要求记录路径,事实上仅仅要看一下每一步之后所能延伸到的最远的位置就能够了,在这一个最远位置前面的那些位置,都是能够到达的,假设扫到了某个i,它大于当前 ...
随机推荐
- bisect二分查找模块使用
import bisectL = [1, 3, 3, 6, 8, 12, 15]x = 5x_insert_point = bisect.bisect_left(L, x)# 在L中查找x,x存在时返 ...
- Codeforces Round 536 (Div. 2) (E)
layout: post title: Codeforces Round 536 (Div. 2) author: "luowentaoaa" catalog: true tags ...
- oracle tablespace usage status
select a.tablespace_name, a.bytes / 1024 / 1024 "Sum MB", (a.bytes - b.bytes) / 1024 / 102 ...
- 更新archlinux
有个上网本,虽然配置很差,但是安装的是arch,这不长时间不滚动更新出问题了, :: Proceed with installation? [Y/n] (/) checking keys % (/) ...
- Scrum之成败——从自身案例说起,仅供参考
从07年中初次接触Scrum的概念到其中几年项目中逐渐实践CI.TDD,到亲自掌握项目实践Scrum近一年,最终我们放弃了Scrum这个框架和所谓的“自组织”.原因为何? 1.成员放弃了Scrum所“ ...
- 【带修莫队】【权值分块】bzoj3196 Tyvj 1730 二逼平衡树
这题用了三种算法写: 分块+二分:O(n*sqrt(n*log(n)) 函数式权值分块:O(n*sqrt(n)) 带修莫队+权值分块:O(n5/3) 结果……复杂度越高的实际上跑得越快……最后这个竟然 ...
- Java高级架构师(一)第21节:通过X-gen生成商品模块
package com.sishuok.architecture1.goodsmgr.vo; import com.sishuok.architecture1.common.vo.BaseModel; ...
- Scala零基础教学【41-60】
第41讲:List继承体系实现内幕和方法操作源码揭秘 def main(args: Array[String]) { /** * List继承体系实现内幕和方法操作源码揭秘 * * List本身是一个 ...
- iOS开发——使用基于Autolayout的ScrollView
问题描述: 在使用Autolayout布局方式对ScrollView进行布局时,如果你想做一个可以垂直方向滚动的九宫格类似这样: 拿一行来说,一定不要想当然的尝试去给一行图标进行均匀排列的操作(指 ...
- Android 架构 4.总结
以下是Keegan小钢大神原创博客: Android项目重构之路:架构篇Android项目重构之路:界面篇Android项目重构之路:实现篇 看了这几篇文章,以及下面的评论,总结一下,以便以后拓展: ...