题目大意:给出一道数独题,判断该数独是否有解且有唯一解。

解题思路:

  由前几题的难度得,此题的难度不会太过分,所以简单暴力就可以了,40ms用时一本满足。

  简单地讲一下具体的实现,从左上开始从左到右从上到下一格一格枚举过去,枚举当前格子的数字时,判断一下这个数字能不能用就行了(判断是否在该行,该列,该区域出现过),全部填满时就找到了一个解,找到第二个解的时候停止搜索即可。

  关于判断某个数字在当前区域是否用过,比较方便的方法是,事先算好p[i][j],用来记录第i行第j格属于哪一列,哪一行,哪一区域,这样在写dfs时会方便很多。

代码:

/*
被注释掉的代码都是用来调试的,取消注释后可以用来查看程序运行过程以便调试。
*/#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
using namespace std;
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define MST(a,b) memset(a,b,sizeof(a))
#define MAXL 10
int error;//用于发现不合理时终止程序
int g[MAXL][MAXL];//存放数组初始状态
int p1[MAXL][MAXL],p2[MAXL][MAXL],p3[MAXL][MAXL];//分别记录(i,j)所对应的行,列,区域
int b1[MAXL][MAXL],b2[MAXL][MAXL],b3[MAXL][MAXL];//记录编号为i的行,列,区域的数字使用情况
void init()//读入部分
{error=0;FOR(i,1,9)FOR(j,1,9)scanf("%d",&g[i][j]);MST(b1,0);MST(b2,0);MST(b3,0);FOR(i,1,9)FOR(j,1,9)if(g[i][j]){int p=p1[i][j],x=g[i][j];if(b1[p][x])error=1;b1[p][x]=1;p=p2[i][j];if(b2[p][x])error=1;b2[p][x]=1;p=p3[i][j];if(b3[p][x])error=1;b3[p][x]=1;}
}
int g2[MAXL][MAXL];//调试时用的数组,可无视
int tot;//记录解的个数
void dfs(int x,int y)
{if(x==10)//dfs到第10行意味着已经全部填满
    {tot++;if(tot>1)error=1;//若发现第二个解则终止程序/*FOR(i,1,9){FOR(j,1,9)printf("%d ",g2[i][j]+g[i][j]);printf("\n");}printf("\n");*/return;}int xt=x,yt=y+1;//计算下一个if(yt>9){xt++;yt=1;}if(g[x][y]){dfs(xt,yt);return;}//若该格已有数字则无需尝试,直接进入下一格int c1=p1[x][y],c2=p2[x][y],c3=p3[x][y];//记录当前格所在的行,列,区域的编号FOR(i,1,9)if(b1[c1][i]+b2[c2][i]+b3[c3][i]==0)//是否在当前行,列,区域都未使用
    {b1[c1][i]=1;b2[c2][i]=1;b3[c3][i]=1;//g2[x][y]=i;dfs(xt,yt);//进入下一格继续尝试//g2[x][y]=0;if(error)return;b1[c1][i]=0;b2[c2][i]=0;b3[c3][i]=0;}
}
void work()//计算部分g2和输出error什么的请无视
{MST(g2,0);tot=0;dfs(1,1);//if(error)printf("error");if(tot==0 || error)printf("No\n");else printf("Yes\n");
}
int main()
{freopen("in.txt","r",stdin);//文件输入以便调试//freopen("out.txt","w",stdout);FOR(i,1,9)FOR(j,1,9)p1[i][j]=i;FOR(i,1,9)FOR(j,1,9)p2[i][j]=j;FOR(i,1,9)FOR(j,1,9)p3[i][j]=((i-1)/3)*3+((j-1)/3)+1;//预处理i,j所在区域/*FOR(i,1,9){FOR(j,1,9)printf("%d ",p3[i][j]);printf("\n");}*///上面的代码用来检查预处理时有无算错,下面开始是正片int nn;scanf("%d",&nn);FOR(ii,1,nn){init();if (error){printf("No\n");continue;}work();}}

转载于:https://www.cnblogs.com/USTC-ACM/archive/2013/03/12/2955423.html

上交三月月赛[SJTU] 1106 sudoku相关推荐

  1. 上交三月月赛[SJTU] 1105 path

    这题主要是字符读入的问题吧,对于NAME的读入,一直getchar()到',',对于后面的五个属性from,to,length,people number,light只读数字就可以了,而且他们的处理相 ...

  2. 【洛谷月赛】洛谷三月月赛题解报告

    昨天就是洛谷三月月赛,小编考的并不好,才31分,隔壁大佬50分,于是小编决定改一改题,先看第一题: P5238 整数校验器 题目描述 有些时候需要解决这样一类问题:判断一个数 x 是否合法. x 合法 ...

  3. 洛谷P5238 整数校验器【三月月赛】

    题目描述 https://www.luogu.org/problemnew/show/P5238 主要考虑的有几点 1.单独"-"是不行的,-0类似的也不行,00,01,02这样的 ...

  4. 洛谷三月月赛——P5238 整数校验器

    题目链接: P5238 整数校验器 题目描述 有些时候需要解决这样一类问题:判断一个数 xxx 是否合法. xxx 合法当且仅当其满足如下条件: xxx 格式合法,一个格式合法的整数要么是 000,要 ...

  5. 上海市计算机学会竞赛平台(iai.sh.cn)2023三月月赛(丙组)解题报告

    前言 总的来说这次的丙组偏简单,像我这个菜鸟都能在赛场上AK,之前的比赛后两题会有递归搜索并且要有一定的数学思维,但这次并没有什么高深的算法或者数学思维. 一到三题不用多说,是模拟题,可能带点技巧.从 ...

  6. USACO全部月赛及GateWay数据

    月赛: 以07年open为例,网站如下 http://contest.usaco.org/OPEN07 其他的格式是http://contest.usaco.org/月份(月份的英文前三位,比如1月是 ...

  7. 2022DASCTF X SU 三月春季挑战赛 checkin 各种脚本学习分析

    只能溢出0x10个字节,刚好能够覆盖返回地址,所以得利用栈迁移来做 第一种:利用magic_gadget修改got表中setvbuf的值 在64位程序的_do_global_dtors_aux中有这么 ...

  8. 第十四届蓝桥杯三月真题刷题训练——第 21 天

    目录 第 1 题:灭鼠先锋 问题描述 运行限制 代码: 思路: 第 2 题:小蓝与钥匙 问题描述 答案提交 运行限制 代码: 思路 : 第 3 题:李白打酒加强版 第 4 题:机房 第 1 题:灭鼠先 ...

  9. 牛客小白月赛28 B.牛牛和牛可乐的赌约2

    牛客小白月赛28 B.牛牛和牛可乐的赌约2 题目链接 题目描述 牛牛感觉在上一次赌约中,情况对于自己非常不利,所以决定再赌一场. 这时候,牛蜓队长出现了:第一,绝对不意气用事:第二,绝对不漏判任何一件 ...

最新文章

  1. 马斯克学什么计算机语言,马斯克头脑风暴——对计算机如醉如痴
  2. 选择结构_标准if-else语句
  3. 从1行代码到20万行开源,我已经走过了三年
  4. Django:模板与视图
  5. 传澳洲电讯急寻汽车之家买家,接手财团有意私有化
  6. word 2016 for Mac 如何缩小编号与后面文字之间的缩进间隙
  7. 深入理解BigDecimal
  8. 为什么 Java 不支持类多重继承?
  9. 商业模式画布 - 天涯的日志 - 网易博客
  10. 电信光猫 DDNS路由设置-基于DNSPOD
  11. 购买计算机设备计入什么科目,企业购买设备计入什么会计科目?附会计分录
  12. [杜撰的故事]那天以后
  13. mysql配置secure_file_priv
  14. SGE上的qsub以及作业的状态查看
  15. 实践▍用大数据扒一扒蔡徐坤的真假流量粉 | Alfred数据室
  16. Android动画之帧动画
  17. ubuntu18.04安装时ACPI error 无法进入系统的问题
  18. 开车,网吧,魔兽争霸,几天独特的生活体验
  19. 获取当天早上8点 - 明天早上8点时间
  20. JavaScript的数组练习

热门文章

  1. 将页面元素置为不可修改Readonly,所有元素统一修改,统一调用
  2. 2022-2028年中国盲盒产业研究及前瞻分析报告
  3. 2022-2028年中国橡胶密封制品行业市场研究及前瞻分析报告
  4. 样本不平衡不均衡数据处理
  5. CMD 输入中文看不到输入法的解决方法
  6. Python List extend()方法
  7. pycharm debug后会出现 step over /step into/step into my code /force step into /step out 分别表示...
  8. relay.build调用关系
  9. YOLO、SSD、FPN、Mask-RCNN检测模型对比
  10. 如何评估两张图片的差异