博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
YbtOJ——深度搜索【例题2】数独游戏
阅读量:2154 次
发布时间:2019-04-30

本文共 1008 字,大约阅读时间需要 3 分钟。

B. 【例题2】数独游戏

在这里插入图片描述

题解

经过不断地debug,终于用自己的方法做出这题了。

我的方法跟书上的不同,自认为更简单些。

用三个二维数组分别记录每一行、列、宫中是否出现1~9,即判重,来进行剪枝。

dfs每个输入时就储存下来的空着的格子,枚举1~9并根据判重数组判断能否填入该数字。
填完所有空格后,输出并直接退出,最后别忘了初始化那三个判重数组,因为有多组数据。
若点 ( x , y ) (x,y) x,y的数为 t t t,三个判重的数组可以这样写:

fx[x][t]=1;//行fy[y][t]=1;//列fg[(x-1)/3*3+(y-1)/3+1][t]=1;//宫

对于宫判重,我们将宫编号:

在这里插入图片描述
套用我想出的小公式: ( x − 1 ) / 3 ∗ 3 + ( y − 1 ) / 3 + 1 (x-1)/3*3+(y-1)/3+1 (x1)/33+(y1)/3+1(证明略)就可求出每个点属于的宫。

代码

#include
#include
#include
using namespace std;int a[100][100],b[100][2],c[100],fx[10][10],fy[10][10],fg[10][10],n;string s;bool check(int x,int y,int t)//判断是否可填该数{
if(fx[x][t]||fy[y][t]||fg[(x-1)/3*3+(y-1)/3+1][t]) return false; else //无重复,即可填,判重数组标记为一 {
fx[x][t]=1; fy[y][t]=1; fg[(x-1)/3*3+(y-1)/3+1][t]=1; return true; }}void back(int x,int y,int t)//回溯,还原信息{
fx[x][t]=0; fy[y][t]=0; fg[(x-1)/3*3+(y-1)/3+1][t]=0;}bool dfs(int dep){
if(dep>n) {
n=0; for(int i=1; i<=9; i++) {
for(int j=1; j<=9; j++) {
if(a[i][j]) cout<

转载地址:http://hhpwb.baihongyu.com/

你可能感兴趣的文章
【Pyton】【小甲鱼】异常处理:你不可能总是对的
查看>>
APP性能测试工具
查看>>
【Pyton】【小甲鱼】类和对象
查看>>
压力测试工具JMeter入门教程
查看>>
作为一名软件测试工程师,需要具备哪些能力
查看>>
【Pyton】【小甲鱼】类和对象:一些相关的BIF(内置函数)
查看>>
【Pyton】【小甲鱼】魔法方法
查看>>
单元测试需要具备的技能和4大阶段的学习
查看>>
【Loadrunner】【浙江移动项目手写代码】代码备份
查看>>
Python几种并发实现方案的性能比较
查看>>
[Jmeter]jmeter之脚本录制与回放,优化(windows下的jmeter)
查看>>
Jmeter之正则
查看>>
【JMeter】1.9上考试jmeter测试调试
查看>>
【虫师】【selenium】参数化
查看>>
【Python练习】文件引用用户名密码登录系统
查看>>
学习网站汇总
查看>>
【Python】用Python打开csv和xml文件
查看>>
【Loadrunner】性能测试报告实战
查看>>
【自动化测试】自动化测试需要了解的的一些事情。
查看>>
【selenium】selenium ide的安装过程
查看>>