LeetCode 37 解数独
**
题目:
编写一个程序,通过已填充的空格来解决数独问题。
一个数独的解法需遵循如下规则:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
空白格用 ‘.’ 表示。
一个数独。
答案被标成红色。
Note:
给定的数独序列只包含数字 1-9 和字符 ‘.’ 。
你可以假设给定的数独只有唯一解。
给定数独永远是 9x9 形式的。
**
开发环境:Vs Code
源代码:
#include<iostream>
using namespace std;
//全局变量
bool sign = false;
//全局变量 定义一个数独 二维数组
//其中0代表空
int map[9][9] = {
{5, 3, 0, 0, 7, 0, 0, 0, 0},
{6, 0, 0, 1, 9, 5, 0, 0, 0},
{0, 9, 8, 0, 0, 0, 0, 6, 0},
{8, 0, 0, 0, 6, 0, 0, 0, 3},
{4, 0, 0, 8, 0, 3, 0, 0, 1},
{7, 0, 0, 0, 2, 0, 0, 0, 6},
{0, 6, 0, 0, 0, 0, 2, 8, 0},
{0, 0, 0, 4, 1, 9, 0, 0, 5},
{0, 0, 0, 0, 8, 0, 0, 7, 9},
};
//输出数独函数的声明
void show();
//深度搜索函数的声明
int search(int n);
//判断key填入n时是否满足条件 函数的声明
bool Check(int n, int key);
int main(){
search(0);
show();
system("pause");
return 0;
}
//输出数独函数的实现
void show()
{
for (int i = 0; i < 9; i++){
for (int j = 0; j < 9; j++){
cout << map[i][j] << " " ;
}
cout << endl;
}
}
//深度搜索函数的实现
int search(int n)
{
//所有的都符合,退出递归
if (n > 80)
{
sign = true;
return 0;
}
//当前位不为空时跳过
if (map[n/9][n%9] != 0)
{
search(n+1);
}
else{
//否则对当前位进行枚举测试
for (int i = 1; i <= 9; i++)
{
//满足条件时填入数字
if (Check(n, i) == true)
{
map[n/9][n%9] = i;
//继续搜索
search(n+1);
//返回时如果构造成功,则直接退出
if (sign == true) return 0;
//如果构造不成功,还原当前位
map[n/9][n%9] = 0;
}
}
}
}
//判断key填入n时是否满足条件 函数的声明
bool Check(int n, int key)
{
//判断n所在横列是否合法
for (int i = 0; i < 9; i++)
{
//j为n竖坐标
int j = n / 9;
if (map[j][i] == key)
return false;
}
//判断n所在竖列是否合法
for (int i = 0; i < 9; i++)
{
//j为n横坐标
int j = n % 9;
if (map[i][j] == key)
return false;
}
//x为n所在的小九宫格左顶点竖坐标
int x = n / 9 / 3 * 3;
//y为n所在的小九宫格左顶点横坐标
int y = n % 9 / 3 * 3;
//判断n所在的小九宫格是否合法
for (int i = x; i < x + 3; i++)
{
for (int j = y; j < y + 3; j++)
{
if (map[i][j] == key)
return false;
}
}
//全部合法,返回正确
return true;
}
参考自:https://blog.youkuaiyun.com/qq_31558353/article/details/50615760