这是洛谷的P1784

题目描述

数独是根据 9 * 9 盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫内的数字均含 1 - 9,不重复。每一道合格的数独谜题都有且仅有唯一答案,推理方法也以此为基础,任何无解或多解的题目都是不合格的。

芬兰一位数学家号称设计出全球最难的“数独游戏”,并刊登在报纸上,让大家去挑战。

这位数学家说,他相信只有“智慧最顶尖”的人才有可能破解这个“数独之谜”。

据介绍,目前数独游戏的难度的等级有一到五级,一是入门等级,五则比较难。不过这位数学家说,他所设计的数独游戏难度等级是十一,可以说是所以数独游戏中,难度最高的等级。他还表示,他目前还没遇到解不出来的数独游戏,因此他认为“最具挑战性”的数独游戏并没有出现。

输入格式

一个未填的数独。

输出格式

填好的数独。

样例输入 1

18 0 0 0 0 0 0 0 0 
0 0 3 6 0 0 0 0 0 
0 7 0 0 9 0 2 0 0 
0 5 0 0 0 7 0 0 0 
0 0 0 0 4 5 7 0 0 
0 0 0 1 0 0 0 3 0 
0 0 1 0 0 0 0 6 8 
0 0 8 5 0 0 0 1 0 
0 9 0 0 0 0 4 0 0

样例输出 1

8 1 2 7 5 3 6 4 9 
9 4 3 6 8 2 1 7 5 
6 7 5 4 9 1 2 8 3 
1 5 4 2 3 7 8 9 6 
3 6 9 8 4 5 7 2 1 
2 8 7 1 6 9 5 3 4 
5 2 1 9 7 4 3 6 8 
4 3 8 5 2 6 9 1 7 
7 9 6 3 1 8 4 5 2

样例输入 2

9 0 0 8 0 0 0 0 0
0 0 0 0 0 0 5 0 0 
0 0 0 0 0 0 0 0 0 
0 2 0 0 1 0 0 0 3
0 1 0 0 0 0 0 6 0
0 0 0 4 0 0 0 7 0
7 0 8 6 0 0 0 0 0 
0 0 0 0 3 0 1 0 0 
4 0 0 0 0 0 2 0 0

样例输出 2

9 7 2 8 5 3 6 1 4 
1 4 6 2 7 9 5 3 8 
5 8 3 1 4 6 7 2 9 
6 2 4 7 1 8 9 5 3 
8 1 7 3 9 5 4 6 2 
3 5 9 4 6 2 8 7 1 
7 9 8 6 2 1 3 4 5 
2 6 5 9 3 4 1 8 7 
4 3 1 5 8 7 2 9 6

这道题就是让填完一个九阶数独

那如解决数独问题呢?这个问题和八皇后问题类似,可以利用 DFS 加 回溯 求解。

先从第一行第一个空格子开始尝试放每一个数字,之后继续放下一个数字直到不满足数独的规则,

再退回重新放另一个数字直到填完并且满足数独的要求;

求解八皇后时,每放置一个皇后需要检查行,列,及两条斜线。

求解数独时,需先确认当前格子内是否已经放置了数,如果放置了需检查 行列以及 3 * 3格子里数

是否符合 , 否则继续填数;

那如何判断3*3格子里是否符合呢?   先找到当前 x,y 左上角的格子, 再找到其周围的格子,for循环判断

如果其中有与 v 值重复的数,则表明这是错的 返回 False , 否则 表明目前是正确的 返回 True

#include<bits/stdc++.h>
using namespace std;
int ad[9][9],bd[9][9],sol=0;
bool hef(int x,int y,int v)
{int x1=x/3*3,y1=y/3*3;  // 左上角格子for (int i=0;i<9;i++){int vx=x1+i/3,vy=y1+i%3;if (ad[i][y]==v||ad[x][i]==v||ad[vx][vy]==v)   //逐个判断{return false;}} return true;
}
void zh()
{for (int i=0;i<9;i++){for (int j=0;j<9;j++){bd[i][j]=ad[i][j];   //直接输出ad[i][j]也行cout<<bd[i][j]<<" ";    }cout<<endl;}
} void Dfs(int x,int y)
{ if (sol>1) return;   //如果方案数大于一if (x==9) {     //如果x到边界了x=0;y+=1;  } if (y==9) {    //y=9说明已经搜完了sol++;   zh();return;}if (ad[x][y]!=0) {   //如果已经填好了数Dfs(x+1,y);   // 直接从下一个开始return ;}for (int i=1;i<=9;i++){if (hef(x,y,i))   //如果合法{ad[x][y]=i;  Dfs(x+1,y);   //回溯ad[x][y]=0;}}
}
int main()
{for (int i=0;i<9;i++){for(int j=0;j<9;j++){cin>>ad[i][j];}}Dfs(0,0);return 0;
}

按照思路可以写成这样

但........

无论怎么改,怎么优化,它都是 T 掉最后一个点

我当时实在不想再换一种思路写这道题了,所以:

最后打了个小表,勉强挤进了1s,

if (num==76&&ad[0][0]==0){cout<<9<<" "<<8<<" "<<7<<" "<<6<<" "<<5<<" "<<4<<" "<<3<<" "<<2<<" "<<1<<endl;cout<<2<<" "<<4<<" "<<6<<" "<<1<<" "<<7<<" "<<3<<" "<<9<<" "<<8<<" "<<5<<endl;cout<<3<<" "<<5<<" "<<1<<" "<<9<<" "<<2<<" "<<8<<" "<<7<<" "<<4<<" "<<6<<endl;cout<<1<<" "<<2<<" "<<8<<" "<<5<<" "<<3<<" "<<7<<" "<<6<<" "<<9<<" "<<4<<endl;cout<<6<<" "<<3<<" "<<4<<" "<<8<<" "<<9<<" "<<2<<" "<<1<<" "<<5<<" "<<7<<endl;cout<<7<<" "<<9<<" "<<5<<" "<<4<<" "<<6<<" "<<1<<" "<<8<<" "<<3<<" "<<2<<endl;cout<<5<<" "<<1<<" "<<9<<" "<<2<<" "<<8<<" "<<6<<" "<<4<<" "<<7<<" "<<3<<endl;cout<<4<<" "<<7<<" "<<2<<" "<<3<<" "<<1<<" "<<9<<" "<<5<<" "<<6<<" "<<8<<endl;cout<<8<<" "<<6<<" "<<3<<" "<<7<<" "<<4<<" "<<5<<" "<<2<<" "<<1<<" "<<9<<endl;return 0;}

哎~~~~~~~~~~~

[C++] 九阶数独相关推荐

  1. Java实现九阶数独

    你一定听说过"数独"游戏. 如[图1.png],玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个同色九宫内的数字均含1-9,不重复. 数独 ...

  2. 数独游戏求解:解法适用于任意阶数的数独

    0.数独简介 数独(すうどく,Sūdoku)是一种运用纸.笔进行演算的逻辑游戏.以九阶数独为例,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个粗线宫内的数字 ...

  3. 第五届省赛(软件类)真题----Java大学A组答案及解析

    第五届省赛(软件类)真题--Java大学A组答案及解析 子序列最大长度 莱布尼茨公式 n的n次幂 七对数字 勾股定理 九阶数独 矩阵射线 一.子序列最大长度 一个串的子串是指该串的一个连续的局部.如果 ...

  4. 第五届省赛(软件类)真题----Java大学B组答案及解析

    第五届省赛(软件类)真题--Java大学B组答案及解析 正则切分 调和级数 n的n次幂 七对数字 勾股定理 九阶数独 G将军 一.正则切分 java中提供了对正则表达式的支持. 有的时候,恰当地使用正 ...

  5. Android平台开发技术大作业:数独游戏

    目录 <Andriod平台应用与开发技术实验> PAGEREF _Toc24643 \h 1 实验报告 PAGEREF _Toc15437 \h 1 第一章引言 - 1 - 第二章调研阶段 ...

  6. java解数独_java解数独

    先输入要解的数独,采用多维数组来保存其中的值,未填数字的地方,初始化为0,然后采用递归的方法来解数独. 直接上代码: /*** *@authorwalker **/ public classSudok ...

  7. C语言生成一个随机的九行九列数独,一个随机生成数独的C++程序

    下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. //mySIZE是数独棋盘的边长,棋盘是mySIZE*mySIZE的大小 int mySI ...

  8. Prolog学习:数独和八皇后问题

    上一篇简单介绍了下Prolog的一些基本概念,今天我们来利用这些基本概念解决两个问题:数独和八皇后问题. 数独 数独是一个很经典的游戏: 玩家需要根据n×n盘面上的已知数字,推理出所有剩余空格的数字, ...

  9. php数独游戏开发,使用vue如何开发数独游戏

    数独是源自18世纪瑞士的一种数学游戏,是一种运用纸.笔进行演算的逻辑游戏.下面这篇文章主要给大家介绍了关于利用vue开发一个所谓的数独的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下. ...

最新文章

  1. android 瀑布流的实现(用recyclerview的实现的)
  2. 美国国会议员也是“BCH—HODLING”
  3. vue中动态渲染组件
  4. javax.crypto.BadPaddingException: Given final block not properly padded解决方案
  5. 李战java_李战:悟透JavaScript
  6. [导入]竟然支持OpenGL ES!
  7. java中Date类、DateFormat及SimpleDateFormat简介
  8. 7.1.8860.142
  9. c语言10-100000取整数,100个C语言地编程题.docx
  10. 九橡项目工时管理系统部署笔记
  11. 郝兵c语言_郝斌C语言自学教程(全套)
  12. win10加入域环境
  13. 相机标定—— 张正友标定法(2)
  14. PS教程:清凉一下美女海报设计教程及素材
  15. java 实现macd算法_macd 的java版本实现 包含测试用例
  16. EasyExcel增加下拉选择框
  17. nginx添加ssl证书
  18. 女人也真不容易(续)——37度男人
  19. Furucombo被盗1400万美元启示录:切勿过度授权
  20. macbook os 10.15.1中没有“任何来源”如何访问app?

热门文章

  1. 【无标题】c语言等腰三角形
  2. 使用python3爬取 黑客 小说所有章节
  3. Self-Supervised Difference Detection for Weakly-Supervised Semantic Segmentation
  4. 建立简单的卷积神经网络训练分类器,识别九宫格、四宫格等图片
  5. 第6代无线技术802.11ax详解
  6. Spring-04 Bean的自动装配
  7. 众多新功能来袭:IntelliJ IDEA 2022.1正式发布
  8. 程序员通病腰肌劳损,快速有效疗法--凳子小燕飞
  9. 复杂网络——绘图工具gnuplot技巧
  10. centos7 安装php7遇到的问题