ACM题目————数独
- 描述
-
数独是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个3*3宫内的 数字均含1-9,不重复。 每一道合格的数独谜题都有且仅有唯一答案,推理方法也以此为基础,任何无解或多解的题目都是不合格的。
有一天hrdv碰到了一道号称是世界上最难的数独的题目,作为一名合格的程序员,哪能随随便便向困难低头,于是他决定编个程序来解决它。。
- 输入
- 第一行有一个数n(0< n <100),表示有n组测试数据,每组测试数据是由一个9*9的九宫格构成,0表示对应的格子为空
- 输出
- 输出一个9*9的九宫格,为这个数独的答案
- 样例输入
-
1
0 0 5 3 0 0 0 0 0
8 0 0 0 0 0 0 2 0
0 7 0 0 1 0 5 0 0
4 0 0 0 0 5 3 0 0
0 1 0 0 7 0 0 0 6
0 0 3 2 0 0 0 8 0
0 6 0 5 0 0 0 0 9
0 0 4 0 0 0 0 3 0
0 0 0 0 0 9 7 0 0 - 样例输出
-
1 4 5 3 2 7 6 9 8
8 3 9 6 5 4 1 2 7
6 7 2 9 1 8 5 4 3
4 9 6 1 8 5 3 7 2
2 1 8 4 7 3 9 5 6
7 5 3 2 9 6 4 8 1
3 6 7 5 4 2 8 1 9
9 8 4 7 6 1 2 3 5
5 2 1 8 3 9 7 6 4
DFS题,记着预处理。
#include <stdio.h>
#include <string.h>
int arr[10][10], count;
bool visrow[10][10], viscol[10][10], vissqu[10][10], ok;
struct Node{
int x, y;
} tar[82]; int getsqunum(int i, int j){
return i / 3 * 3 + j / 3;
} void print(){
for(int i = 0; i < 9; ++i)
for(int j = 0; j < 9; ++j)
if(j != 8) printf("%d ", arr[i][j]);
else printf("%d\n", arr[i][j]);
} bool check(int i, int j, int k){
int t = getsqunum(i, j);
if(visrow[i][k] || viscol[j][k] || vissqu[t][k]) return 0;
return 1;
} void DFS(int k){
if(k == count){ ok = 1; print(); return; }
int t = getsqunum(tar[k].x, tar[k].y);
for(int i = 1; i < 10; ++i){
if(check(tar[k].x, tar[k].y, i)){
visrow[tar[k].x][i] = 1;
viscol[tar[k].y][i] = 1;
vissqu[t][i] = 1;
arr[tar[k].x][tar[k].y] = i; DFS(k + 1);
if(ok) return; arr[tar[k].x][tar[k].y] = 0;
visrow[tar[k].x][i] = 0;
viscol[tar[k].y][i] = 0;
vissqu[t][i] = 0;
}
}
} int main(){
int n; scanf("%d", &n);
while(n--){
memset(viscol, 0, sizeof(viscol));
memset(visrow, 0, sizeof(visrow));
memset(vissqu, 0, sizeof(vissqu));
count = 0;
for(int i = 0; i < 9; ++i)
for(int j = 0; j < 9; ++j){
scanf("%d", &arr[i][j]);
if(arr[i][j]){
visrow[i][arr[i][j]] = 1;
viscol[j][arr[i][j]] = 1;
vissqu[getsqunum(i, j)][arr[i][j]] = 1;
}else{
tar[count].x = i;
tar[count++].y = j;
}
}
ok = 0;
DFS(0);
}
return 0;
}
ACM题目————数独的更多相关文章
- ACM题目————中缀表达式转后缀
题目描述 我们熟悉的表达式如a+b.a+b*(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说)操作符在两个操作数中间:num1 operand num2.同理,后缀表达式就是操作符在两 ...
- HDU ACM 题目分类
模拟题, 枚举1002 1004 1013 1015 1017 1020 1022 1029 1031 1033 1034 1035 1036 1037 1039 1042 1047 1048 104 ...
- ACM题目推荐(刘汝佳书上出现的一些题目)[非原创]
原地址:http://blog.csdn.net/hncqp/article/details/1758337 推荐一些题目,希望对参与ICPC竞赛的同学有所帮助. POJ上一些题目在http://16 ...
- 有一种acm题目叫做,奇葩!
本文全然没有技术含量,纯粹是娱乐. 我事实上想写点东西.可是近期好像做计算几何做得太多了,一种想说说不出东西的感觉,唯有写一下一些奇葩的题目了. HDU3337:Guess the number pi ...
- ACM题目————STL练习之求次数
题目地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=1112 描述 题意很简单,给一个数n 以及一个字符串str,区间[i,i+n-1] 为一个 ...
- ACM题目————zoj问题
题目1006:ZOJ问题 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:20322 解决:3560 题目描述: 对给定的字符串(只包含'z','o','j'三种字符),判断他是否能AC. ...
- ACM题目————又见拦截导弹
描述 大家对拦截导弹那个题目应该比较熟悉了,我再叙述一下题意:某国为了防御敌国的导弹袭击,新研制出来一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:它的第一发炮弹能够到达任意的高度,但是以后每一发炮 ...
- ACM题目————还是畅通工程
Submit Status Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路 ...
- ACM题目————小A的计算器
Description 以往的操作系统内部的数据表示都是二进制方式,小A新写了一个操作系统,系统内部的数据表示为26进制,其中0-25分别由a-z表示. 现在小A要在这个操作系统上实现一个计算器,这 ...
随机推荐
- DTMF Stresstesting
import threading,time,serial,sys from random import randrange port_snd=14 port_recv=2 recnt=0 ser_ ...
- Java数据库操作大全
1.提取单条记录 //import java.sql.*; Connection con=null; Statement stmt=null; ResultSet %%6=null; try { Cl ...
- bash 截取字符串
转载自http://blog.chinaunix.net/uid-1757778-id-3162034.html 命令的2种替换形式 $()和 ``示例:截断字符串 a): #截取文件名称 ...
- For循环输出九九乘法表
题:使用For循环输出九九乘法表 解析: 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 .... 1*9=9 ........ .....9*9=81 可以看做j*i ...
- C++之路进阶——codevs4416(FFF的后宫)
4416 FFF 团卧底的后宫 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 你在某日收到了 FFF 团卧底的求 ...
- ios blog
转得一个朋友的博客,大家可以看哈(主要时国外的) 主要分开发教程.示例项目.UI设计.问题解决几块. 开发教程: 即便过了入门阶段,还是要经常看看一些不错的实例教程. .http://mobile.t ...
- TF255466: Team Foundation Server 的配置过程无法继续。以前的更新或安装需要重
在验证是否可以安装 SharePoint 时的提示,Error [ System Checks ] TF255466: The configuration process for Team Found ...
- struts2中Double类型的转换
今天做项目,ssh + Extjs,页面js中定义了几个NumberField,对应的value都是double类型的,其中有个NumberField的name为 name,结果执行的时候报错了,说找 ...
- server端推送消息机制
推送技术相关请参加WIKI: https://zh.wikipedia.org/wiki/%E6%8E%A8%E9%80%81%E6%8A%80%E6%9C%AF 场景: 监控系统:后台硬件温度.电压 ...
- FM000
SQL> select To_char(1,'000') from dual; TO_C----001 注意最左边有一个空格 SQL> select To_char(1,'FM000') ...