我是靠谱客的博主 忧虑短靴,最近开发中收集的这篇文章主要介绍[人工智能]回溯算法解数独,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

今天在AI课上学了CSP,然后学了回溯算法。所以就用回溯算法来解数独吧。

数独问题可以把九九八十一个格简化为81个变量,每一个变量可以取1-9的值,当然,一开始初始化的值是不可以改变的。然后呢,对于这个数独呢,有3个约束条件:(1)每行数字不能重复;(2)每列数字不能重复;(3)每个3*3小区域内数字不能重复。

对于回溯算法,其实就是穷举,穷举出每个格子,也就是每个变量可能的值,如果该赋值不满足约束条件就回溯到上一个格进行下一个值的判断,直到穷举到最后一个格子,那就代表成功了。

代码如下:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int a[9][9] = {
{0,2,0,0,0,0,0,0,0},
{0,0,0,6,0,0,0,0,3},
{0,7,4,0,8,0,0,0,0},
{0,0,0,0,0,3,0,0,2},
{0,8,0,0,4,0,0,1,0},
{6,0,0,5,0,0,0,0,0},
{0,0,0,0,1,0,7,8,0},
{5,0,0,0,0,9,0,0,0},
{0,0,0,0,0,0,0,4,0}
};
int assign[81];
void print(){
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;
}
bool finish(int assign[])
{
for(int i = 0; i < 81; i++)
{
if(a[i / 9][i % 9] == 0)
{
return false;
}
}
return true;
}
bool judge(int x,int y){
for(int i=0;i<9;i++){
if(a[x][i]==a[x][y]&&i!=y)
return false;
}
for(int i=0;i<9;i++){
if(a[i][y]==a[x][y]&&i!=x)
return false;
}
for(int i=x/3*3;i<x/3*3+3;i++){
for(int j=y/3*3;j<y/3*3+3;j++){
if(a[i][j]==a[x][y]&&(i!=x||j!=y))
return false;
}
}
return true;
}
//int v = 0;
void BT(int level)
{
int v = 0;
if(finish(assign) == true)
{
print();
return;
}
while(assign[v] != 0)
{
v += 1;
}
//cout<<v<<endl;
if(assign[v] != 2)
{
assign[v] = 1;
for(int i = 1; i <= 9; i++)
{
a[v / 9][v % 9] = i;
bool constraintsOK = true;
if(judge(v / 9, v % 9) == false)
{
constraintsOK = false;
}
if(constraintsOK == true)
{
//print();
//system("pause");
BT(level + 1);
}
}
a[v / 9][v % 9] = 0;
assign[v] = 0;
//cout<< level<<endl;
return;
}
}
int main()
{
for(int i = 0; i < 81; i++)
{
if(a[i / 9][i % 9] != 0)
{
assign[i] = 2;
}
else
{
assign[i] = 0;
}
}
BT(0);
//cout<< finish(assign)<<endl;
}



最后

以上就是忧虑短靴为你收集整理的[人工智能]回溯算法解数独的全部内容,希望文章能够帮你解决[人工智能]回溯算法解数独所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部