c语音实现九宫格数独求解

本文介绍了如何使用C语言编写一个数独求解程序,通过递归和条件判断函数,检查并填充数独矩阵,确保每一行、每一列以及3x3宫格内数字不重复。
摘要由CSDN通过智能技术生成

 #include<stdio.h>

#define n 9

int k[n][n];

int z[n][n];

int o;

int stop;

void put()

{

    int i,j;

    for(i=0;i<n;i++)

    {

        for(j=0;j<n;j++){

            printf("%d",z[i][j]);

        }

        printf("\n");

    }

}

int judge1(int k,int i,int j)

{

    int m;

    for(m=0;m<n;m++){

        if(z[m][j]==k&&m!=i){

            return 0;

        }

        if(z[i][m]==k&&m!=j){

            return 0;

        }

    }

    return 1;

}

int judge2(int k,int i,int j)

{

    int a,c;

    a=i;

    c=j;

    while(a%3!=0){

        a--;

    }

    while(c%3!=0){

        c--;

    }

    int x,y;

    int count[n+1]={

    0}

    ;

    for(x=a;x<a+3;x++)

    {

        for(y=c;y<c+3;y++)

        {

            if(x==i&&y==j){

                count[k]++;

            }

            else{

                count[z[x][y]]++;

            }

        }

    }

    for(x=1;x<n+1;x++){

        if(count[x]>1){

            return 0;

        }

    }

    return 1;

}

int check()

{

    int i,j;

    for(i=0;i<n;i++)

    {

        for(j=0;j<n;j++)

        {

            if(z[i][j]){

                if(judge1(z[i][j],i,j)==0){

                    return 0;

                }

                if(judge2(z[i][j],i,j)==0){

                    return 0;

                }

            }

        }

    }

    return 1;

}

void solve(int i)

{

    if(stop){

        return;

    }

    int p,q,m;

    p=i/n;

    q=i%n;

    if(i==n*n){

        printf("答案%d:\n",o);

        o++;

        put();

        if(o==8){

            stop=1;

            printf("仅展示前7个所得解\n");

        }

    }

    else if(k[p][q]!=0){

        solve(i+1);

    }

    else{

        for(m=1;m<n+1;m++)

        {

            if(judge1(m,p,q)&&judge2(m,p,q)){

                z[p][q]=m;

                solve(i+1);

                if(stop){

                    return;

                }

                z[p][q]=0;

            }

        }

    }

}

int main()

{printf("请输入一个数独,未知用0替代\n\n");

    stop=0;

    char t[n][n];

    int i,j;

    for(i=0;i<n;i++)

    {

        for(j=0;j<n;j++){

            scanf(" %c",&t[i][j]);

            z[i][j]=k[i][j]=t[i][j]-48;

        }

    }

    if(check())

    {

        o=1;

        solve(0);

        if(o==1){

            printf("无解");

        }

    }

    else{

        printf("输入存在错误");

    }

}

3d92753b03704400b1fe102ba678d2ef.jpg

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值