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 ...
随机推荐
- 谈一谈Dijkstra
dijkstra呢是最短路三大算法之一.很多人都觉得不如spfa,但是这两者在跑稠密图时,dijkstra有奇效 在讲之前先说一说食用方法: 适用于有向的无负权值的图. 样例飘过 6 9 1 //n个 ...
- UNIX C 总结
--day01--王建立QQ:2529866769今天的内容:一.计算机的框架什么是操作系统?(汽车)加油系统 油门 用户跟加油子系统交互的窗口.(接口)方向系统 方向盘 用户跟方向系统的交互接口.导 ...
- 爬虫文件存储-1:mysql
1.连接并创建数据库 import pymysql db = pymysql.connect(host='localhost', user='root', password='root', port= ...
- 基础命令history
history 记录历史命令 环境变量: HISTSIZE: 命令历史记录的条数: HISTFILE: 命令历史记录的文件,~/.bash_history: HISTFILESIZE: 命令历史 ...
- Matplotlib基本使用简介
目录 Matplotlib基本使用简介 1. Matplotlib简介 2. Matplotlib操作简介 Matplotlib基本使用简介 1. Matplotlib简介 Matplotlib是 ...
- 06007_redis数据存储类型——hash
1.概述 (1)Redis中的Hash类型可以看成具有String Key和String Value的map容器.所以该类型非常适合于存储值对象的信息,如Username.Password和Age等: ...
- bupt summer training for 16 #4 ——数论
https://vjudge.net/contest/173277#overview A.平方差公式后变为 n = (x + y)(x - y) 令 t = x - y ,变成 n = (t + 2x ...
- [poj3735] Training little cats_矩乘快速幂
Training little cats poj-3735 题目大意:给你n个数,k个操作,将所有操作重复m次. 注释:三种操作,将第i个盒子+1,交换两个盒子中的个数,将一个盒子清空.$1\le m ...
- 洛谷—— P2015 二叉苹果树
https://www.luogu.org/problem/show?pid=2015 题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点 ...
- 洛谷 P2548 [AHOI2004]智能探险车
P2548 [AHOI2004]智能探险车 题目描述 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例#1: 复制 4 3 sunny plain full many sunny moun ...