描述:
数独游戏的规则是这样的:在一个9x9的方格中,你需要把数字1-9填写到空格当中,并且使方格的每一行和每一列中都包含1-9这九个数字。同时还要保证,空格中用粗线划分成9个3x3的方格也同时包含1-9这九个数字。比如有这样一个题,大家可以仔细观察一下,在这里面每行、每列,以及每个3x3的方格都包含1-9这九个数字。
思路:
简单DFS。一个一个搜就行了。输入太坑了,还是看了别人代码,才知道怎么输入的。
输入:
7 1 2 ? 6 ? 3 5 8
? 6 5 2 ? 7 1 ? 4
? ? 8 5 1 3 6 7 2
9 2 4 ? 5 6 ? 3 7
5 ? 6 ? ? ? 2 4 1
1 ? 3 7 2 ? 9 ? 5
? ? 1 9 7 5 4 8 6
6 ? 7 8 3 ? 5 1 9
8 5 9 ? 4 ? ? 2 3
输出:
7 1 2 4 6 9 3 5 8
3 6 5 2 8 7 1 9 4
4 9 8 5 1 3 6 7 2
9 2 4 1 5 6 8 3 7
5 7 6 3 9 8 2 4 1
1 8 3 7 2 4 9 6 5
2 3 1 9 7 5 4 8 6
6 4 7 8 3 2 5 1 9
8 5 9 6 4 1 7 2 3
code:
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
int map[10][10];
int x[81],y[81],num;
bool T,H=true;
void dfs(int n);
bool judge(int i,int n);
int main()
{
char ch;
while(cin>>ch){
num=0;
if(ch=='?') { //如果第一个数是问号,则置0,并且把坐标存入
map[0][0]=0;
x[num]=0;
y[num++]=0;
}else map[0][0]=ch-'0';
for(int i=0;i<9;++i) //循环输入其它数
{
for(int j=0;j<9;++j)
{
if(i==0 && j==0) continue;
cin>>ch;
if(ch=='?')
{
map[i][j]=0;
x[num]=i;
y[num++]=j;
}else map[i][j]=ch-'0';
}
}
/*
for(int i=0;i<9;++i){
for(int j=0;j<9;j++){
printf("%d_",map[i][j]);
}
printf("\n");
}*/
T=true;
if(H) {
dfs(0);
H=false;
}
else {
printf("\n");
dfs(0);
}
}
return 0;
}
void dfs(int n){
if(n==num){
for(int i=0;i<9;++i){
printf("%d",map[i][0]);
for(int j=1;j<9;j++){
printf(" %d",map[i][j]);
}
printf("\n");
}
T=false;
return ;
}
for(int i=1;i<=9;++i){
if(judge(i,n) && T){ //判断能否在x[n]、y[n]处数字i;
// printf("也来到这里了\n");
map[x[n]][y[n]]=i;
dfs(n+1);
map[x[n]][y[n]]=0;
}
}
}
bool judge(int i,int n){
for(int m=0;m<9;m++){
if( map[ x[n] ][ m ]==i){
return false;
}
if( map[ m ][ y[n] ]==i){
return false;
}
}
int tempx,tempy;
tempx=x[n]/3*3;
tempy=y[n]/3*3;
for(int a=tempx;a<=tempx+2;++a){
for(int b=tempy;b<=tempy+2;++b){
if(map[a][b]==i){
return false;
}
}
}
return true;
}