Leetcode0037--Sudoku Solver 数独游戏
【转载请注明】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;
}
|
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 |
Leetcode0037--Sudoku Solver 数独游戏的更多相关文章
- sudoku solver(数独)
Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by th ...
- LeetCode:Valid Sudoku,Sudoku Solver(数独游戏)
Valid Sudoku Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku bo ...
- leetcode 37. Sudoku Solver 36. Valid Sudoku 数独问题
三星机试也考了类似的题目,只不过是要针对给出的数独修改其中三个错误数字,总过10个测试用例只过了3个与世界500强无缘了 36. Valid Sudoku Determine if a Sudoku ...
- 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 ...
- Leetcode之回溯法专题-37. 解数独(Sudoku Solver)
Leetcode之回溯法专题-37. 解数独(Sudoku Solver) 编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次.数字 1 ...
- [LeetCode] Valid Sudoku 验证数独
Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be ...
- LeetCode:36. Valid Sudoku,数独是否有效
LeetCode:36. Valid Sudoku,数独是否有效 : 题目: LeetCode:36. Valid Sudoku 描述: Determine if a Sudoku is valid, ...
- [LeetCode] 36. Valid Sudoku 验证数独
Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according to th ...
- Leetcode 笔记 36 - Sudoku Solver
题目链接:Sudoku Solver | LeetCode OJ Write a program to solve a Sudoku puzzle by filling the empty cells ...
随机推荐
- Chrome Headless模式
在 Chrome 59 版本开始已经开始支持了 Headless 模式,也就是无界面模式,这样爬取的时候就不会弹出浏览器了,如果要使用此模式请把 Chrome 升级到 59 版本及以上,启用 Head ...
- android 数据存储之SQLite
使用嵌入式关系型SQLite数据库存储数据 除了可以使用文件或SharedPreferences存储数据,还可以选择使用SQLite数据库存储数据. 在Android平台上,集成了一个嵌入式关系型数据 ...
- 06007_redis数据存储类型——hash
1.概述 (1)Redis中的Hash类型可以看成具有String Key和String Value的map容器.所以该类型非常适合于存储值对象的信息,如Username.Password和Age等: ...
- selenium常用操作,查找元素,操作Cookie,获取截图,获取窗口信息,切换,执行js代码
目录: 1. 常用操作 2. 查找元素 3. 操作Cookie 4. 获取截图 5. 获取窗口信息 6. 切换 7. 执行JS代码 简介 selenium.webdriver.remote.webdr ...
- 绿色地址栏扩展验证(EV)SSL证书、支持SGC 强制最低128位
Pro With EV SSL证书,最严格的域名所有权和企业身份信息验证,属于最高信任级别.最高安全级别的 EV SSL证书,该证书可以使地址栏变成高安全绿色,并且在地址栏内显示您公司的名称,提高 ...
- Tensorflow人工智能入门(一)
前言: 作为一个程序员,已经离开开发岗好多年,最近突然迷茫了,不知道自己何去何从.互联网技术发展的速度已快得难以想象,许久不码代码的手也越来越僵直,需求沟通中的套话和空话却越发的熟练,这和当年入行时的 ...
- [E2E] Visual Differing Tests with Puppeteer and PixelMatch
Take your end to end tests to the next level by comparing your current application's view with an al ...
- [RxJS 6] The Retry RxJs Error Handling Strategy
When we want to handle error observable in RxJS v6+, we can use 'retryWhen' and 'delayWhen': const c ...
- [深入理解Android卷一全文-第十章]深入理解MediaScanner
由于<深入理解Android 卷一>和<深入理解Android卷二>不再出版,而知识的传播不应该由于纸质媒介的问题而中断.所以我将在CSDN博客中全文转发这两本书的全部内容. ...
- 飘逸的python - 极简的二叉树前中后序通杀函数
对于任一结点.能够按某种次序运行三个操作: 訪问结点本身(N) 遍历该结点的左子树(L) 遍历该结点的右子树(R) 用来表示顺序,即,前序NLR/中序LNR/后序LRN. 以下我们用namedtupl ...