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

如题所述

/*
因为你说是数独 可是你只表述了行列相等,如果是数独应该对角线相加也相等,所以我写了两个判断函数,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;
}

温馨提示:内容为网友见解,仅供参考
第1个回答  2015-05-05
//#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;
}

本回答被网友采纳

C语言编写一个3*3数独,保证每行每列的和都相等!!求求各位大神了
\/*因为你说是数独 可是你只表述了行列相等,如果是数独应该对角线相加也相等,所以我写了两个判断函数,judge1为对角线也相等的情况,judge为你描述的行列和相等(情况太多了)结题方案只需要做一次dfs就可以了,还需要配合一个栈来存储dfs的路径,将每个符合条件的路径做一次行列和是否相等的判断 然后...

用c语言写一个简易数独的思路。要代码
= x)||(xy[x][y] == xy[x][i]&&i != y)) return 0; for(i = 0, m = x \/ 3 * 3, n = y \/ 3 * 3; i < 9; i++) if (xy[x][y] == xy[m + i \/ 3][n + i % 3]&&m + i \/ 3 != x&&n + i % 3 != y) return 0; return 1...

3乘3的数独规律
数独(九宫格)的规律是每一行、每一列、每一个粗线宫(3*3)内的数字均含1-9,不重复。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫(3*3)内的数字均含1-9,不重复。数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给...

c语言 编程 数独
1.9*9个格子对应一个数组A,数组的第一个值从0到9表示其中填的数字,0就是不填,另一个值表示它在桌面上的位置就是坐标 2.需要10张图片,空白和9个数字 3.通过对鼠标点击的反应改变格子数组A的值,且将相应图片覆盖在相应坐标上 4.事先输入若干组数组A的值(每组81个数),作为题库 5.进行游戏时...

把1~9这几个数字分别填在3*3的空格里,使每行、每列和每条对角线上的数...
2 7 6 9 5 1 4 3 8 分析规律:正中间数在中间,中左是最大,中右是最小,,其它的,就不用说了吧?如5-13 正中间应为9 其它的按上面规律来排:6 11 10 13 9 5 8 7 12

C语言简单数独.一个3行3列的二维数组当满足下列条件时表明它能构成一...
include<stdio.h>#include<memory.h>#include<stdbool.h>\/\/stackint a[9]={0};\/\/a[0]--a[0][0] a[1]--a[0][1] and so on simulate stackint len=0;\/\/dfsint visited[10]={0};bool judge()\/\/行列相等{ int i,j; int tmp[6]={0}; for(i=0;i<3;i++) ...

一个数独要求是:每行每竖都是一到九不重复,问有几种排法?
9!*8!*7!*6!*5!*4!*3!*2!*1!

用c语言写一个简易抽奖程式,要求有对档案的操作
用c语言写一个简易数独的思路。要程式码 #include<stdio.h>int num[9][9], xy[9][9];int check(int x, int y) { int i, m, n; for(i = 0; i < 9; i++) if ((xy[x][y] == xy[i][y]&&i != x)||(xy[x][y] == xy[x][i]&&i != y)) return 0; for(i = 0,...

数独游戏,在每个小格子内填入一个数字,使得每行,每列,每个3×3方格中...
百度搜索数独计算器 选第一个 然后把数字添入即可

数独问题求解?
通常情况下,找到空格最少的小九宫格,比较这些空格所在行列,选取行列剩余空格较少的那个。将小九宫格和行列中已经出现的数字排除,剩余的就是可选的。例如,第4行、第2列:小九宫格内,2和3尚未使用。从行和列观察,也是2和3尚未使用。可以试填2或3,如能走通,则继续寻找下一个空格,如不能走...

相似回答