博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode - 37. Sudoku Solver
阅读量:6889 次
发布时间:2019-06-27

本文共 2157 字,大约阅读时间需要 7 分钟。

37. Sudoku Solver 

 ----------------------------------------------------------------------------

Mean: 

求解数独.

analyse:

只是9宫格的数独,而且测试数据都不难,所以可以直接使用递归求解,类似于N-Queue问题.

但如果宫格数较多,则需要使用Dancing-Link精确覆盖算法来求解.

Time complexity: O(N)

 

view code

/**
* -----------------------------------------------------------------
* Copyright (c) 2016 crazyacking.All rights reserved.
* -----------------------------------------------------------------
*       Author: crazyacking
*       Date  : 2016-03-02-18.53
*/
#include <queue>
#include <cstdio>
#include <set>
#include <string>
#include <stack>
#include <cmath>
#include <climits>
#include <map>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <bits/stdc++.h>
#include <windows.h>
using
namespace
std;
typedef
long
long(
LL);
typedef
unsigned
long
long(
ULL);
const
double
eps(
1e-8);
class
Solution
{
public
:
   
void
solveSudoku(
vector
<
vector
<
char
>>&
board)
   
{
       
recursiveSolve(
board);
   
}
   
bool
recursiveSolve(
vector
<
vector
<
char
>>&
board)
   
{
       
for(
int
i
=
0;
i
<
9;
++
i)
       
{
           
for(
int
j
=
0;
j
<
9;
++
j)
           
{
               
if(
board
[
i
][
j
]
==
'.')
               
{
                   
for(
int
k
=
1;
k
<=
9;
++
k)
                   
{
                       
board
[
i
][
j
]
=
static_cast
<
char
>(
k
+
'0');
                       
if(
isValid(
board
,
i
,
j)
&&
recursiveSolve(
board))
                           
return
true;
                       
board
[
i
][
j
]
=
'.';
                   
}
                   
return
false;
               
}
           
}
       
}
       
return
true;
   
}
   
bool
isValid(
const
vector
<
vector
<
char
>>&
board
,
const
int
r1
,
const
int
c1)
const
   
{
       
for(
int
i
=
0;
i
<
9;
++
i)
       
{
           
if(
i
!=
r1
&&
board
[
i
][
c1
]
==
board
[
r1
][
c1
])
               
return
false;
           
if(
i
!=
c1
&&
board
[
r1
][
i
]
==
board
[
r1
][
c1
])
               
return
false;
       
}
       
int
rowBegin
=
r1
/
3
*
3;
       
int
colBegin
=
c1
/
3
*
3;
       
for(
int
i
=
rowBegin;
i
<
rowBegin
+
3;
++
i)
       
{
           
for(
int
j
=
colBegin;
j
<
colBegin
+
3;
++
j)
           
{
               
if(
i
!=
r1
&&
j
!=
c1
&&
board
[
i
][
j
]
==
board
[
r1
][
c1
])
                   
return
false;
           
}
       
}
       
return
true;
   
}
};
int
main()
{
   
freopen(
"H:
\\
Code_Fantasy
\\
in.txt"
,
"r"
,
stdin);
   
Solution
solution;
   
vector
<
vector
<
char
>>
ve;
   
string s;
   
while(
cin
>>s)
   
{
       
vector
<
char
>
tempVe;
       
for(
int
i
=
0;
i
<s
.
length();
++
i)
           
tempVe
.
push_back(s
[
i
]);
       
ve
.
push_back(
tempVe);
   
}
   
solution
.
solveSudoku(
ve);
   
return
0;
}
/*
*/

转载地址:http://mrtbl.baihongyu.com/

你可能感兴趣的文章
node js 处理时间分析
查看>>
判断数据库、表和字段是否存在
查看>>
新手安装postgreSQL后无法连接服务器
查看>>
递归和动态规划
查看>>
java实现简单的控制台管理系统
查看>>
建造模式
查看>>
BZOJ 4025: 二分图
查看>>
openNebula rgister img instance vms error collections
查看>>
error Infos
查看>>
PL/sql配置相关
查看>>
[New Portal]Windows Azure Virtual Machine (3) 在VM上挂载磁盘
查看>>
字体随着ProgressBar的加载而滚动
查看>>
Handler 机制再了解
查看>>
如果你是前端工程师,把你的网站或者你知道的网站加进来吧
查看>>
阿里云产品头条(2017年12月刊)
查看>>
探究SQL添加非聚集索引,性能提高几十倍之谜
查看>>
Java 如何不使用 volatile 和锁实现共享变量的同步操作
查看>>
追踪解析 Disruptor 源码
查看>>
【剑指offer】让抽象问题具体化
查看>>
聊聊flink的AbstractNonHaServices
查看>>