[人工智能]回溯算法解数独
今天在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;
}
[人工智能]回溯算法解数独相关推荐
- 回溯算法解数独问题(java版)
下面来详细讲一下如何用回溯算法来解数独问题. 下图是一个数独题,也是号称世界上最难的数独.当然了,对于计算机程序来说,只要算法是对的,难不难就不知道了,反正计算机又不累.回溯算法基本上就是穷举,解这种 ...
- 【算法分析】回溯法解数独(九宫格)算法
这篇文章,是来详细介绍怎样写出一个算法,来解出所有的数独问题.算法的程序运行时间,缩减在了毫秒级别.等到这篇文章结束,我会抽时间写一篇文章,介绍如何生成一个随机的唯一解的数独问题.另外,为了做图形方便 ...
- 回溯算法解子集、组合、排序
转载labuladong:力扣 代码方面,回溯算法的框架: result = [] def backtrack(路径, 选择列表):if 满足结束条件:result.add(路径)returnfor ...
- 一个点是否在矩形内的算法_478,回溯算法解单词搜索
想了解更多数据结构以及算法题,可以关注微信公众号"数据结构和算法",每天一题为你精彩解答. 问题描述 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序 ...
- C语言||暴力算法解数独
前言 前几天在玩解数独游戏时,发现有点费时间.心血来潮想实现一个解数独的c语言程序,根据我在晚解数独游戏的思路,采用了暴力算法求解.在数组维数的选择上,我选择了用一维数组实现. 分析 其实暴力算法求解 ...
- 【算法题】解数独-用深度优先搜索(DFS)算法解数独
描述 输入一个数独棋盘,用0代表待填的空格 输出数独的一个解 示例 输入: 0 9 2 4 8 1 7 6 3 4 1 3 7 6 2 9 8 5 8 6 7 3 5 9 4 1 2 6 2 4 1 ...
- java回溯算法解决数独_js回溯算法解决数独问题
直接上代码 代码里面注释很清晰 传说中的最难数组大概是在20ms左右解决 /** * 数独算法 */ class Sudoku { constructor({ display = false, sud ...
- LeetCode算法 —— 解数独
题目如下所示: 编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以粗实 ...
- python回溯法解9*9数独
文章目录 前言 一.回溯法解数独代码 总结 前言 看了labuladong算法小抄里的回溯法,照着模板,加入自己的理解,用python做了个解9*9数独的回溯法,. 一.回溯法解数独代码 直接上代码: ...
最新文章
- ABP-JavaScript API
- html 查询表单,如何让我的HTML表单查询适用于所有表单元素?
- Python计算机视觉:第六章 图像聚类
- b区计算机复试国家线,考研国家线/自主划线/a区b区线/专业线这些考研复试分数线你能分清吗?...
- Struts 整合 SpringMVC
- linux 下脚本安装 mysql_linux(centos7)下编译安装mysql(数据库)一键安装详解+脚本文件...
- 如何安装python3.8_python3.8下载及安装步骤详解
- 用Notepad++来编写第一个HTML网页程序,你也可以!!!
- android emulator培训,android emulator(未完)
- Unity NGUI 制作URL超链接点击打开网页
- web打印网页指定区域
- oracle10g--使用expdp导出数据和impdp导入数据
- 给自己立一个flag
- 面试- 阿里-. 大数据题目- 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?...
- android主题设置
- python脚本控制ios手机app_iOS自动打包ipa(Python脚本)
- Android 音乐APP(一)扫描本地音乐
- 优链时代入围Internet Deep 【2022元宇宙TOP500】榜!
- QT4.8.6调用zlib库实现数据流的压缩与解压缩
- 【C语言】-万字博客详解任意棋盘的三子棋小游戏!!!快进来瞅瞅吧