描述:

数独游戏的规则是这样的:在一个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;
}
Last modification:January 12th, 2020 at 04:36 am
如果觉得我的文章对你有用,请随意赞赏