[C++] 九阶数独
这是洛谷的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++] 九阶数独相关推荐
- Java实现九阶数独
你一定听说过"数独"游戏. 如[图1.png],玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个同色九宫内的数字均含1-9,不重复. 数独 ...
- 数独游戏求解:解法适用于任意阶数的数独
0.数独简介 数独(すうどく,Sūdoku)是一种运用纸.笔进行演算的逻辑游戏.以九阶数独为例,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个粗线宫内的数字 ...
- 第五届省赛(软件类)真题----Java大学A组答案及解析
第五届省赛(软件类)真题--Java大学A组答案及解析 子序列最大长度 莱布尼茨公式 n的n次幂 七对数字 勾股定理 九阶数独 矩阵射线 一.子序列最大长度 一个串的子串是指该串的一个连续的局部.如果 ...
- 第五届省赛(软件类)真题----Java大学B组答案及解析
第五届省赛(软件类)真题--Java大学B组答案及解析 正则切分 调和级数 n的n次幂 七对数字 勾股定理 九阶数独 G将军 一.正则切分 java中提供了对正则表达式的支持. 有的时候,恰当地使用正 ...
- Android平台开发技术大作业:数独游戏
目录 <Andriod平台应用与开发技术实验> PAGEREF _Toc24643 \h 1 实验报告 PAGEREF _Toc15437 \h 1 第一章引言 - 1 - 第二章调研阶段 ...
- java解数独_java解数独
先输入要解的数独,采用多维数组来保存其中的值,未填数字的地方,初始化为0,然后采用递归的方法来解数独. 直接上代码: /*** *@authorwalker **/ public classSudok ...
- C语言生成一个随机的九行九列数独,一个随机生成数独的C++程序
下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. //mySIZE是数独棋盘的边长,棋盘是mySIZE*mySIZE的大小 int mySI ...
- Prolog学习:数独和八皇后问题
上一篇简单介绍了下Prolog的一些基本概念,今天我们来利用这些基本概念解决两个问题:数独和八皇后问题. 数独 数独是一个很经典的游戏: 玩家需要根据n×n盘面上的已知数字,推理出所有剩余空格的数字, ...
- php数独游戏开发,使用vue如何开发数独游戏
数独是源自18世纪瑞士的一种数学游戏,是一种运用纸.笔进行演算的逻辑游戏.下面这篇文章主要给大家介绍了关于利用vue开发一个所谓的数独的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下. ...
最新文章
- android 瀑布流的实现(用recyclerview的实现的)
- 美国国会议员也是“BCH—HODLING”
- vue中动态渲染组件
- javax.crypto.BadPaddingException: Given final block not properly padded解决方案
- 李战java_李战:悟透JavaScript
- [导入]竟然支持OpenGL ES!
- java中Date类、DateFormat及SimpleDateFormat简介
- 7.1.8860.142
- c语言10-100000取整数,100个C语言地编程题.docx
- 九橡项目工时管理系统部署笔记
- 郝兵c语言_郝斌C语言自学教程(全套)
- win10加入域环境
- 相机标定—— 张正友标定法(2)
- PS教程:清凉一下美女海报设计教程及素材
- java 实现macd算法_macd 的java版本实现 包含测试用例
- EasyExcel增加下拉选择框
- nginx添加ssl证书
- 女人也真不容易(续)——37度男人
- Furucombo被盗1400万美元启示录:切勿过度授权
- macbook os 10.15.1中没有“任何来源”如何访问app?