您的位置:首页 > 其它

NYOJ 722 数独

2014-07-19 10:29 316 查看

[b]数独[/b]

时间限制:1000ms|内存限制:65535KB
难度:4

[b]描述[/b]
数独是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个3*3宫内的数字均含1-9,不重复。每一道合格的数独谜题都有且仅有唯一答案,推理方法也以此为基础,任何无解或多解的题目都是不合格的。

有一天hrdv碰到了一道号称是世界上最难的数独的题目,作为一名合格的程序员,哪能随随便便向困难低头,于是他决定编个程序来解决它。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<climits>
#include<ctype.h>
#include<cmath>
#include<algorithm>
#defineLLlonglong
usingnamespacestd;
intd[9][9];
boolisValid(intx,inty,intval){
inti,j,a=x/3,b=y/3;
for(i=0;i<9;i++)
if(d[x][i]==val||d[i][y]==val)returnfalse;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
if(d[i+a*3][j+b*3]==val)returnfalse;
}
}
returntrue;
}
booldfs(intcur){
if(cur==81)returntrue;
if(d[cur/9][cur%9])
returndfs(cur+1);
for(inti=1;i<10;i++){
if(isValid(cur/9,cur%9,i)){
d[cur/9][cur%9]=i;
if(dfs(cur+1))returntrue;
}
}
d[cur/9][cur%9]=0;
returnfalse;
}
intmain(){
intkase,i,j;
scanf("%d",&kase);
while(kase--){
for(i=0;i<9;i++){
for(j=0;j<9;j++)
scanf("%d",d[i]+j);
}
dfs(0);
for(i=0;i<9;i++){
for(j=0;j<8;j++)
printf("%d",d[i][j]);
printf("%d\n",d[i][j]);
}
}
return0;
}


ViewCode



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: