C语言编写一个3*3数独,保证每行每列的和都相等!!求求各位大神了

2024年11月23日 05:20
有2个网友回答
网友(1):

/*
因为你说是数独 可是你只表述了行列相等,如果是数独应该对角线相加也相等,所以我写了两个判断函数,judge1为对角线也相等的情况,judge为你描述的行列和相等(情况太多了)
结题方案只需要做一次dfs就可以了,还需要配合一个栈来存储dfs的路径,将每个符合条件的路径做一次行列和是否相等的判断 然后输出就是要的结果!
*/
#include
#include
#include
//stack
int a[9]={0};//a[0]--a[0][0] a[1]--a[0][1] and so on  simulate stack
int len=0;
//dfs
int visited[10]={0};
bool judge()//行列相等
{
    int i,j;
    int tmp[6]={0};
    for(i=0;i<3;i++)
        for(j=0;j<3;j++)
            tmp[i]+=a[3*i+j];
    for(i=0;i<3;i++)
        for(j=0;j<3;j++)
            tmp[3+i]+=a[i+3*j];
    int jud=tmp[0];
    for(i=1;i<6;i++)
    {
        if(jud!=tmp[i])
            return false;
    }
    return true;
}
bool judge1()//行列相等 对角线也相等
{
    int i,j;
    int tmp[8]={0};
    for(i=0;i<3;i++)
        for(j=0;j<3;j++)
            tmp[i]+=a[3*i+j];
    for(i=0;i<3;i++)
        for(j=0;j<3;j++)
            tmp[3+i]+=a[i+3*j];
    tmp[7]=a[0]+a[4]+a[8];
    tmp[6]=a[2]+a[4]+a[6];
    int jud=tmp[0];
    for(i=1;i<8;i++)
    {
        if(jud!=tmp[i])
            return false;
    }
    return true;
}
void printa()
{
    int t,p;
    for(t=0;t<3;t++)
    {
        for(p=0;p<3;p++)
        {
            printf("%d ",a[3*t+p]);
        }
        printf("\n");
    }
}
void dfs(int i,int v[])
{
    if(i==10)//find one solution
    {
        if(judge1())//给你写了两个判断函数 如果对角线也相等那么用judge1()即可判断
            printa();
        return;
    }

    int j;
    for(j=1;j<=9;j++)
    {
        int tmp[10];
        memcpy(tmp,v,10*sizeof(int));
        if(tmp[j]==0)
        {
            tmp[j]=1;
            a[len++]=j;
            //printf("%d %d\n",len-1,a[len-1]);
            dfs(i+1,tmp);
            len--;
        }

    }


}
int main(void)
{
    dfs(1,visited);
    return 0;
}

网友(2):

//#include "stdafx.h"//vc++6.0加上这一行.
#include "stdio.h"
int main(void){
    char s[3][3]={0},i,j,x;
    for(i=2,j=x=1;x<10;x++,i++,j++){
        if(i==3 && j<3)i-=3;
        else if(j==3 && i<3)j-=3;
        else if(i==3 && j==3 || s[i][j]!=0){
            i-=2;
            j-=1;
        }
        s[i][j]=x;
    }
    for(i=0;i<3;i++){
        for(j=0;j<3;j++)
            printf("%3d",s[i][j]);
        printf("\n");
    }
    return 0;
}