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

 我来答
百度网友53aaec5
2015-05-05 · 超过63用户采纳过TA的回答
知道小有建树答主
回答量:80
采纳率:100%
帮助的人:80.2万
展开全部
/*
因为你说是数独 可是你只表述了行列相等,如果是数独应该对角线相加也相等,所以我写了两个判断函数,judge1为对角线也相等的情况,judge为你描述的行列和相等(情况太多了)
结题方案只需要做一次dfs就可以了,还需要配合一个栈来存储dfs的路径,将每个符合条件的路径做一次行列和是否相等的判断 然后输出就是要的结果!
*/
#include<stdio.h>
#include<memory.h>
#include<stdbool.h>
//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;
}
White_MouseYBZ
2015-05-05 · TA获得超过4万个赞
知道大有可为答主
回答量:2.1万
采纳率:82%
帮助的人:6656万
展开全部
//#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;
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式