比较容易想到的是用回溯法,从第一个格子开始到最后一格,每个格子由1到9进行尝试,看能否填下去,不能就回头。思路简单,可是执行时间太长了。有没有更加高效的搜索算法了?当然有。
      我们仅需要改变搜索的顺序,或者说改变填数的方法。
     先将数字1分别填入1到9区域中,然后再将数字2填入1到9区域,重复该操作,直到所有空位都被填满为止。
     为什么这样就快了?因为先将一个数字成功填入9个区域的制约性,远远大于按顺序地从第一个填到最后一个格。假设第一行全是空的,在第一行的第一格填了数字1,然后假如在第二行填不下数字1,证明第一行的数字1填错了,这时通过回溯纠正它,最坏需要9!次。
但如果是一个个区域地填入数字1,当第二个1填不下时,马上就能回溯到上一个1去纠正它的位置了。
具体C语言源程序如下:
#include<stdio.h>
#include<string.h>
int quyu[4][4]={{0,0,0,0},
                        {0,1,2,3},
                        {0,4,5,6},
                        {0,7,8,9}};
int a[10][10],hang[10][10],lie[10][10],grid[10][10],sum;
int p[10][2]={{0,0},{1,1},{1,4},{1,7},{4,1},{4,4},{4,7},{7,1},{7,4},{7,7}};
//p[i][0]和p[i][1]数组记录第i个区域的左上角的横纵坐标
void init()
{
 int i,j,k;
 memset(hang,0,sizeof(hang));
 memset(lie,0,sizeof(lie));
 memset(grid,0,sizeof(grid));
 sum=0; 
 for(i=1;i<=9;i++)
 for(j=1;j<=9;j++) 
 {
   scanf("%d",&k);
   a[i][j]=k;
   if(k)
  {
    hang[i][k]=1;    //第i行填入k了
    lie[j][k]=1;       //第j列填入k了
    grid[quyu[(i-1)/3+1][(j-1)/3+1]][k]=1;  //  (i , j)所在区域填入k了
    sum++;
   }
 }
}
void outt()
{
 int i,j;
 for(i=1;i<=9;i++)
 {
  for(j=1;j<=8;j++) printf("%d ",a[i][j]);
  printf("%d\n",a[i][9]);
 }
}
void solve(int k1,int k2)  //将数字k1填入区域k2
{
  int x,y,i,j;
  if(sum==81) {outt();return;}  //数独全填好了就输出
  if(grid[k2][k1])   //区域k2中已有数字k1了
  {
   if(k2<9) solve(k1,k2+1); //填下一个区域
   else solve(k1+1,1); //填下一个数字
  }
  x=p[k2][0]; y=p[k2][1];
  for(i=x;i<=x+2;i++)
for(j=y;j<=y+2;j++)
if(a[i][j]==0 && hang[i][k1]==0 && lie[j][k1]==0) //第(i,j)格为空,且可填入k1
{
a[i][j]=k1;
sum++;
hang[i][k1] = lie[j][k1] = 1;
if(k2<9) solve(k1,k2+1); //填下一个区域
else solve(k1+1,1); //填下一个数字
a[i][j]=0;
sum--;
hang[i][k1] = lie[j][k1] = 0;
}
}
int main()
{
 init();
 solve(1,1);  //将数字1从区域1开始填起
 return 0;
}

数独(九宫格)的高效算法相关推荐

  1. CVPR2020论文介绍: 3D 目标检测高效算法

    CVPR2020论文介绍: 3D 目标检测高效算法 CVPR 2020: Structure Aware Single-Stage 3D Object Detection from Point Clo ...

  2. 再谈poj2965(高效算法)

    在枚举分类中已有暴力枚举的方法解这道题.之后在网上看到大神的高效算法,膜拜之.故copy在此. /*参考高手的高效解法: > 证明:要使一个为'+'的符号变为'-',必须其相应的行和列的操作数为 ...

  3. 对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符

    题目描述 对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符. 给定一个字符串(不一定全为字母)A及它的长度n.请返回第一个重复出现的字符.保证字符串中有重复字符,字符串的长度小于等于500 ...

  4. ( 设计高效算法 ) 年龄排序 Age Sort Uva 11462

    ( 设计高效算法 ) 年龄排序 Age Sort Uva 11462 可以使用整数排序法, 内存太小无法堆排序. #include <cstdio> #include <cstrin ...

  5. 3d 自动生成物体_CVPR2020论文介绍: 3D 目标检测高效算法

    CVPR2020论文介绍: 3D 目标检测高效算法 CVPR 2020: Structure Aware Single-Stage 3D Object Detection from Point Clo ...

  6. 九宫怎么排列和使用_开心数独:好友都在玩的数独九宫格小游戏,居家无聊杀时间必备!...

    今日游戏推荐 开心数独 关键词:休闲益智.数独.2048.烧脑.数字推理.脑力游戏 游戏简介:数独九宫格,趣味数字谜题小游戏 游戏特色 <开心数独>游戏提供了关卡.随机.四宫.九宫多种玩法 ...

  7. 【FFT/IDFT】高效算法

    题目: 设x(n)是长度为2N的有限长实序列,X(k)为x(n)的2N点 DFT. (1)试设计用一次N点FFT完成计算X(k)的高效算法; (2)若已知 X(k),试设计用一次N点 IFFT实现求X ...

  8. 算法心得:高效算法的奥秘 作者:[美] Henry S. Warren, Jr.

    书籍信息 名称:<算法心得:高效算法的奥秘>电子书PDF版 作者:[美] Henry S. Warren, Jr. 出版社:机械工业出版社 内容简介 在本书中,作者给我们带来了一大批极为诱 ...

  9. 《算法心得:高效算法的奥秘(原书第2版)》

    <算法心得:高效算法的奥秘(原书第2版)> 基本信息 原书名:Hacker's Delight,Second Edition 原出版社: Addison-Wesley Profession ...

  10. C#,楔子数(Sphenic Number)的暴力算法与高效算法源代码

    楔子数(Sphenic Number)来自于一个题目: Schoolboy Vasya is interested in the problem of distinguishing prime num ...

最新文章

  1. 三维基因组染色质环(loop)结构
  2. VConsole的使用
  3. 数据库性能测试方案示例
  4. 电商网站前台与后台系统架构
  5. 梦幻手游登录显示服务器爆满,《梦幻西游》手游全服爆满,iOS二区开启_ 《梦幻西游》手游官网-人人都玩,无处不在...
  6. AC automation 模板
  7. 微软解释:关于Outlook 2007的争议
  8. java web相关试卷_JavaWeb试卷四
  9. ucgui添加自定义汉字库
  10. GDI函数 StretchDIBits,StretchBlt 缩小图片会有黑点的问题解决办法
  11. 汽车电子电气(E/E)构架变革
  12. Win 10 版NVIDIA GeForce GTX 1060显卡驱动的下载及飞桨(Paddle)的安装
  13. 全国高中数学联赛——代数
  14. 在线AES加密/解密工具
  15. 苹果维修堪比登天难:评级F,获得最低分2.75分
  16. 巴西龟饲养日志----六月底乌龟状况
  17. 程序代码中到底用英语起名还是用拼音?
  18. Python练习题:凯撒密码 的一种简单解法
  19. echarts怎么控制圆饼图的大小
  20. Artificial Intelligence A Modern Approach 第二版笔记(一)

热门文章

  1. FIRST系列机器人比赛(大赛系列第10期)
  2. js 跳出循环(break, try catch, return)
  3. 【seo】新网站快速上百度首页seo优化的方法, 百度seo网站优化
  4. 今天在“在线打字系统”完成的一次打字成绩截图记录。
  5. 三款开源工具让你的演示脱颖而出
  6. 充电桩解决方案-计费控制单元
  7. Gym - 100623I Important Wires
  8. edd算法 matlab,特征选择、特征提取MATLAB算法实现(模式识别)
  9. 操作系统学习笔记(十四)~进程同步单元测试
  10. scrapyd爬虫一直在运行,无法停止