C语言编写一个3*3数独,保证每行每列的和都相等!!求求各位大神了
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;
}
展开全部
//#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;
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询