【转载请注明】http://www.cnblogs.com/igoslly/p/8719622.html

来看一下题目:

Write a program to solve a Sudoku puzzle by filling the empty cells.

Empty cells are indicated by the character '.'.

You may assume that there will be only one unique solution.

题目意思:

完成数独游戏的计算

在做这题的前两天,楼主正在摸索华为笔试题的时候,已经写了一个非常直白的实现,具体链接如下:

http://www.cnblogs.com/igoslly/p/8708960.html

不过和原题有些区别:① 所有数据均以字符串形式保存  ②  需要填写的位置以 “.” 代替 0

我们稍稍修改下代码,就可以得到实现方法1

bool check(int n,char key,vector<vector<char>> num){
for(int i=;i<;i++){
int j=n/;
if(num[j][i]==key)
{
return false;
}
}
for(int i=;i<;i++)
{
int j=n%;
if(num[i][j]==key){return false;}
} int x=n//*;
int y=n%/*;
for(int i=x;i<x+;i++){
for(int j=y;j<y+;j++){
if(num[i][j]==key){return false;}
}
}
return true;
}
void dfs(int n,vector<vector<char>> &num,bool *sign){
if(n>)
{
*sign=true;
return;
}
if(num[n/][n%]!='.')
{
dfs(n+,num,sign);
}else{
for(char i='';i<='';i++)
{
if(check(n,i,num)==true){
num[n/][n%]=i;
dfs(n+,num,sign);
if(*sign==true) return;
}
}
num[n/][n%]='.';
}
}
class Solution {
public:
void solveSudoku(vector<vector<char>>& board) {
bool sign=false;
dfs(,board,&sign);
}
};

实现方法2:

优化check函数,将原先逐行、逐列遍历进行判断的方法 → 记录每行、每列、每九宫格是否含有当前数字

具体实施(较原先冗长的代码简短太多):

    // line[i][j],column[i][j],subcube[i][j] 分别代表数独每行、每列、每个子单元是否含有数字j(对应1-9)
bool line[][],column[][],subcube[][];

进行dfs前,首先要对原题给出的数字进行记录

// 将所有数组置为false
memset(line,false,sizeof(line));
memset(column,false,sizeof(column));
memset(subcube,false,sizeof(subcube));
// 根据题意,设定初始数组的值
for(int i=;i<;i++){
for(int j=;j<;j++){
if(board[i][j]=='.')
continue; int num=board[i][j]-'';
// 给定题目存在问题,无解,直接返回
int cube=i/* + j/;
if(line[i][num] || column[j][num] || subcube[cube][num])
return ;
line[i][num] = column[j][num] = subcube[cube][num] = true;
}
}

实现方法3:

在实现方法1中,我们使用 n = 0~80 来记录当前填充空格,根据 n 是否越界判断数独填充是否完成。

当然我们也可以采用 i & j / row & col 对位置进行记录,更为直观;

逐行进行填充时,需要对 j > 8 (初始 0)进行换行操作:

// 当j>8时,i++,否则 i 值不变
// 当j>8时,及时取余,重新从0~8计算
(i,j) -> (i+(j+)/,(j+)%)

具体递归代码:

    bool step(vector<vector<char>>&board,int i,int j){
if(i==)
return true;
if(board[i][j]!='.')
{
if(i==&&j==){
return true;
}
else{
return step(board,i+(j+)/,(j+)%); // step里值表示i,j换行
}
} int cube=i/* + j/;
for(int k=;k<;k++){
if(line[i][k] || column[j][k] || subcube[cube][k])
continue;
line[i][k] = column[j][k] = subcube[cube][k] = true;
board[i][j] = ''+k; if(step(board,i+(j+)/,(j+)%)) // 若数独已完成,直接返回true
return true;
line[i][k] = column[j][k] = subcube[cube][k] = false;
board[i][j] = '.';
}
return false;
}
 
 
G
M
T
 
Detect language
Afrikaans
Albanian
Arabic
Armenian
Azerbaijani
Basque
Belarusian
Bengali
Bosnian
Bulgarian
Catalan
Cebuano
Chichewa
Chinese (Simplified)
Chinese (Traditional)
Croatian
Czech
Danish
Dutch
English
Esperanto
Estonian
Filipino
Finnish
French
Galician
Georgian
German
Greek
Gujarati
Haitian Creole
Hausa
Hebrew
Hindi
Hmong
Hungarian
Icelandic
Igbo
Indonesian
Irish
Italian
Japanese
Javanese
Kannada
Kazakh
Khmer
Korean
Lao
Latin
Latvian
Lithuanian
Macedonian
Malagasy
Malay
Malayalam
Maltese
Maori
Marathi
Mongolian
Myanmar (Burmese)
Nepali
Norwegian
Persian
Polish
Portuguese
Punjabi
Romanian
Russian
Serbian
Sesotho
Sinhala
Slovak
Slovenian
Somali
Spanish
Sundanese
Swahili
Swedish
Tajik
Tamil
Telugu
Thai
Turkish
Ukrainian
Urdu
Uzbek
Vietnamese
Welsh
Yiddish
Yoruba
Zulu
  Afrikaans
Albanian
Arabic
Armenian
Azerbaijani
Basque
Belarusian
Bengali
Bosnian
Bulgarian
Catalan
Cebuano
Chichewa
Chinese (Simplified)
Chinese (Traditional)
Croatian
Czech
Danish
Dutch
English
Esperanto
Estonian
Filipino
Finnish
French
Galician
Georgian
German
Greek
Gujarati
Haitian Creole
Hausa
Hebrew
Hindi
Hmong
Hungarian
Icelandic
Igbo
Indonesian
Irish
Italian
Japanese
Javanese
Kannada
Kazakh
Khmer
Korean
Lao
Latin
Latvian
Lithuanian
Macedonian
Malagasy
Malay
Malayalam
Maltese
Maori
Marathi
Mongolian
Myanmar (Burmese)
Nepali
Norwegian
Persian
Polish
Portuguese
Punjabi
Romanian
Russian
Serbian
Sesotho
Sinhala
Slovak
Slovenian
Somali
Spanish
Sundanese
Swahili
Swedish
Tajik
Tamil
Telugu
Thai
Turkish
Ukrainian
Urdu
Uzbek
Vietnamese
Welsh
Yiddish
Yoruba
Zulu
         
 
 
 
Text-to-speech function is limited to 200 characters
 
  Options : History : Feedback : Donate Close

Leetcode0037--Sudoku Solver 数独游戏的更多相关文章

  1. sudoku solver(数独)

    Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by th ...

  2. LeetCode:Valid Sudoku,Sudoku Solver(数独游戏)

    Valid Sudoku Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku bo ...

  3. leetcode 37. Sudoku Solver 36. Valid Sudoku 数独问题

    三星机试也考了类似的题目,只不过是要针对给出的数独修改其中三个错误数字,总过10个测试用例只过了3个与世界500强无缘了 36. Valid Sudoku Determine if a Sudoku ...

  4. POJ - 2676 Sudoku 数独游戏 dfs神奇的反搜

    Sudoku Sudoku is a very simple task. A square table with 9 rows and 9 columns is divided to 9 smalle ...

  5. Leetcode之回溯法专题-37. 解数独(Sudoku Solver)

    Leetcode之回溯法专题-37. 解数独(Sudoku Solver) 编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次.数字 1 ...

  6. [LeetCode] Valid Sudoku 验证数独

    Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be ...

  7. LeetCode:36. Valid Sudoku,数独是否有效

    LeetCode:36. Valid Sudoku,数独是否有效 : 题目: LeetCode:36. Valid Sudoku 描述: Determine if a Sudoku is valid, ...

  8. [LeetCode] 36. Valid Sudoku 验证数独

    Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according to th ...

  9. Leetcode 笔记 36 - Sudoku Solver

    题目链接:Sudoku Solver | LeetCode OJ Write a program to solve a Sudoku puzzle by filling the empty cells ...

随机推荐

  1. for循环提高内存访问效率的做法

    今天写程序的时候突然想到一点,记录一下: 计算机内存地址是线性排列组织的,而利用for循环对高维数组结构进行遍历处理的时候,要保证最内层for循环遍历的是高维数组的最低维度,这样可以最大化利用CPU的 ...

  2. Linq表达式写法

    Linq表达式,实现按照某个字段排序的简单写法. 做项目的时候遇到的一个简单问题,于是记下来. 列举一个例子: <T> model=new <T>(); 加入model中有要根 ...

  3. 【POJ 1981】Circle and Points(已知圆上两点求圆心坐标)

    [题目链接]:http://poj.org/problem?id=1981 [题意] 给你n个点(n<=300); 然后给你一个半径R: 让你在平面上找一个半径为R的圆; 这里R=1 使得这个圆 ...

  4. Eleastisearch6.0.0 read_only_allow_delete: false

    Eleastisearch6.0.0由单节点升级到多节点集群cluster时候出现的分片同步错误问题解决 原创 2018年01月18日 16:33:21 5 启动多个节点的ES后,ES开始推举mast ...

  5. PatentTips - Indexes of graphics processing objects in GPU commands

    BACKGROUND A graphics processing unit (GPU) is a specialized electronic device that is specifically ...

  6. 中缀表达式转逆波兰式(后缀表达式)求值 C++ Stack

    给一个包含小数的中缀表达式 求出它的值 首先转换为后缀表达式然后利用stack求出值 转换规则: 如果字符为'('  push else if 字符为 ')' 出栈运算符直到遇到‘(' else if ...

  7. 一段关于python 闭包的例子

    >>> def counter(a=0): ... count = a ... def incr(): ... b = 1 + count ... return b ... retu ...

  8. 查看OS 各项参数

    查看CPU 在linux下 cat /proc/cpuinfo 可以得到CPU信息. 要注意的是CPU型号有不同的种类比如AMD Intel.可能在这个文件中显示的信息也不同.但终归是存在这个文件中的 ...

  9. Clojure:读取xml

    在Clojure中读取XML是很容易的.比如我们有一个名叫strings.xml文件: <?xml version="1.0" encoding="utf-8&qu ...

  10. MVC.Net:WebAPI添加对jsonP的支持

    在某些情况下,我们需要在WebAPI项目中添加对jsonP的支持.比如我们同时创建了MVC.Net和WebAPI两个项目,这两个项目使用不同的端口,这时如果MVC.Net项目的前端想要直接访问WebA ...