今天在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;
}

[人工智能]回溯算法解数独相关推荐

  1. 回溯算法解数独问题(java版)

    下面来详细讲一下如何用回溯算法来解数独问题. 下图是一个数独题,也是号称世界上最难的数独.当然了,对于计算机程序来说,只要算法是对的,难不难就不知道了,反正计算机又不累.回溯算法基本上就是穷举,解这种 ...

  2. 【算法分析】回溯法解数独(九宫格)算法

    这篇文章,是来详细介绍怎样写出一个算法,来解出所有的数独问题.算法的程序运行时间,缩减在了毫秒级别.等到这篇文章结束,我会抽时间写一篇文章,介绍如何生成一个随机的唯一解的数独问题.另外,为了做图形方便 ...

  3. 回溯算法解子集、组合、排序

    转载labuladong:力扣 代码方面,回溯算法的框架: result = [] def backtrack(路径, 选择列表):if 满足结束条件:result.add(路径)returnfor ...

  4. 一个点是否在矩形内的算法_478,回溯算法解单词搜索

    想了解更多数据结构以及算法题,可以关注微信公众号"数据结构和算法",每天一题为你精彩解答. 问题描述 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序 ...

  5. C语言||暴力算法解数独

    前言 前几天在玩解数独游戏时,发现有点费时间.心血来潮想实现一个解数独的c语言程序,根据我在晚解数独游戏的思路,采用了暴力算法求解.在数组维数的选择上,我选择了用一维数组实现. 分析 其实暴力算法求解 ...

  6. 【算法题】解数独-用深度优先搜索(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 ...

  7. java回溯算法解决数独_js回溯算法解决数独问题

    直接上代码 代码里面注释很清晰 传说中的最难数组大概是在20ms左右解决 /** * 数独算法 */ class Sudoku { constructor({ display = false, sud ...

  8. LeetCode算法 —— 解数独

    题目如下所示: 编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以粗实 ...

  9. python回溯法解9*9数独

    文章目录 前言 一.回溯法解数独代码 总结 前言 看了labuladong算法小抄里的回溯法,照着模板,加入自己的理解,用python做了个解9*9数独的回溯法,. 一.回溯法解数独代码 直接上代码: ...

最新文章

  1. ABP-JavaScript API
  2. html 查询表单,如何让我的HTML表单查询适用于所有表单元素?
  3. Python计算机视觉:第六章 图像聚类
  4. b区计算机复试国家线,考研国家线/自主划线/a区b区线/专业线这些考研复试分数线你能分清吗?...
  5. Struts 整合 SpringMVC
  6. linux 下脚本安装 mysql_linux(centos7)下编译安装mysql(数据库)一键安装详解+脚本文件...
  7. 如何安装python3.8_python3.8下载及安装步骤详解
  8. 用Notepad++来编写第一个HTML网页程序,你也可以!!!
  9. android emulator培训,android emulator(未完)
  10. Unity NGUI 制作URL超链接点击打开网页
  11. web打印网页指定区域
  12. oracle10g--使用expdp导出数据和impdp导入数据
  13. 给自己立一个flag
  14. 面试- 阿里-. 大数据题目- 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?...
  15. android主题设置
  16. python脚本控制ios手机app_iOS自动打包ipa(Python脚本)
  17. Android 音乐APP(一)扫描本地音乐
  18. 优链时代入围Internet Deep 【2022元宇宙TOP500】榜!
  19. QT4.8.6调用zlib库实现数据流的压缩与解压缩
  20. 【C语言】-万字博客详解任意棋盘的三子棋小游戏!!!快进来瞅瞅吧

热门文章

  1. 操作系统学习笔记(二十四)~页框分配和颠簸+内核内存分配+虚拟内存中的其他考虑
  2. root后的华为手机,华为手机可以root
  3. QCC51XX---Earbud peer pair与handset pair
  4. MySQL 5 7 10最新版本源代码安装详细过程
  5. 客户机win10设置共享目录
  6. python上位机开发经验总结01
  7. 【HDOJ】4607 Park Visit_天涯浪子_新浪博客
  8. 小白读iOS冗余资源扫描脚本
  9. 不确定性推理的基本概念
  10. Codeforces 1169E DP