c语言数独检查函数 数独问题c语言

求大神赐我C语言编写“解数独”的思路咯喂

玩过数独都知道数独做起来本来就很复杂,特别是到了最后还要猜数,验证

成都创新互联公司主营罗田网站建设的网络公司,主营网站建设方案,app软件开发,罗田h5微信小程序定制开发搭建,罗田网站营销推广欢迎罗田等地区企业咨询

你还在入门阶段就尝试这么复杂的问题真的很有挑战精神呢

机解数独的步骤:

建立一个数组

1:确定唯一数(没有集合做的很麻烦呢,不过笨办法还有有的,不详写),有些格子的数是唯一的,如果有唯一数,跳到第二步;

如果没有,则跳得到第三步;

2:将唯一数代入数组,跳到第一步;

3:做一个循环判定,如果是空位,确定数字的可能的情况(不详写),在做一个选择判断,

情况1:选择一个数字,跳到第一步;

情况2:选择第二个数字,跳到第一步;

........

分太少了,楼主好好努力吧

求C语言 检查一个TXT文件 (里面是9*9个数) 是否满足数独的条件

(哥们真的写了很久,一定要给分分啊。)

(两个测试过的文件为)

1 2 3 4 5 6 7 8 9

2 3 4 5 6 7 8 9 1

3 4 5 6 7 8 9 1 2

4 5 6 7 8 9 1 2 3

5 6 7 8 9 1 2 3 4

6 7 8 9 1 2 3 4 5

7 8 9 1 2 3 4 5 6

8 9 1 2 3 4 5 6 7

9 1 2 3 4 5 6 7 8

第二个

写的太乱了,不抄了,程序正确性应该蛮高的,在测试的时候把逻辑有弄了一遍。

你看代码的话可能第一次有点累,请耐心点看吧。

希望我的努力能对你有所帮助。

你的算法有些问题

简单来说

1*2*3*4 = 24

但是1*1*1*24 = 24;

而你的题目并没有规定数字一定是各位数,且不能重复,所以用楼主的算法在这种情况下是不成立的。

我用我的方法写一下,写好了上传

#include stdio.h

int isDig(char a)

{

if(48=aa=57)

{

return 1;

}

return 0;

}

void read(FILE *txtF, int numArr[], int arrSize)

{

int digFlag, number, putFlag,i;

char c;

digFlag = 0;

putFlag = digFlag;

number = 0;

i=0;

while((c = getc(txtF))!=EOF)

{

if(isDig(c))

{

putFlag = digFlag = 1;

}

else

{

digFlag = 0;

}

if(putFlag != digFlag)

{

if(i=arrSize)

{

break;

}

else

{

numArr[i++] = number;

}

putFlag = digFlag;

number = 0;

}

if(digFlag)

{

number = number*10+(c-48);

}

}

if(number!= 0)

numArr[i] = number;

}

int check(int arr[])

{

int a[10] = {0};

int i,j;

for(i=1; i10; i++)

{

for(j=1; j10; j++)

{

if(arr[i-1] == j)

{

a[j] = 1;

break;

}

}

}

for(i=1; i10; i++)

{

if(a[i] == 0)

{

return 0;

}

}

return 1;

}

int rowCheck(int arr[])

{

int i,j,k;

int a[9];

for(i=0; i73; i+=9)

{

for(j=i, k=0; ji+9; j++,k++)

{

a[k] = arr[j];

}

if(!check(a))

{

printf("Row check fail at line %d\n", i+1);

return 0;

}

}

return 1;

}

int lineCheck(int arr[])

{

int i,j,k;

int a[9];

for(i=0; i9; i++)

{

for(j=i, k=0; j=i+72; j+=9, k++)

{

a[k] = arr[j];

}

if(!check(a))

{

printf("Line check fail at line %d\n", i+1);

return 0;

}

}

return 1;

}

int squareCheck(int arr[])

{

int i,j,h,k;

int a[9];

for(i=0; i61; i+=3)

{

for(j=i,k=0; ji+3; j++)

{

for(h=j; h=j+18; h+=9, k++)

{

a[k] = arr[h];

}

}

if(!check(a))

{

printf("Square check fails at the square start at %d\n", i+1);

return 0;

}

}

return 1;

}

int main(void)

{

void read(FILE*, int[], int);

int check(int[]);

int rowCheck(int[]);

int lineCheck(int[]);

int squareCheck(int[]);

FILE * fp;

int arr[81];

int i;

if((fp = fopen("data2.txt", "r"))==NULL)

{

printf("Open failed");

return 0;

}

read(fp, arr, 81);

for(i=0; i81; i++)

{

printf("%d ",arr[i]);

if((i+1)%9 == 0 )

printf("\n");

}

fclose(fp);

printf("Row Check: %d\n", rowCheck(arr));

printf("Line Check: %d\n", lineCheck(arr));

printf("Square Check: %d\n", squareCheck(arr));

}

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

/*

因为你说是数独 可是你只表述了行列相等,如果是数独应该对角线相加也相等,所以我写了两个判断函数,judge1为对角线也相等的情况,judge为你描述的行列和相等(情况太多了)

结题方案只需要做一次dfs就可以了,还需要配合一个栈来存储dfs的路径,将每个符合条件的路径做一次行列和是否相等的判断 然后输出就是要的结果!

*/

#includestdio.h

#includememory.h

#includestdbool.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;i3;i++)

for(j=0;j3;j++)

tmp[i]+=a[3*i+j];

for(i=0;i3;i++)

for(j=0;j3;j++)

tmp[3+i]+=a[i+3*j];

int jud=tmp[0];

for(i=1;i6;i++)

{

if(jud!=tmp[i])

return false;

}

return true;

}

bool judge1()//行列相等 对角线也相等

{

int i,j;

int tmp[8]={0};

for(i=0;i3;i++)

for(j=0;j3;j++)

tmp[i]+=a[3*i+j];

for(i=0;i3;i++)

for(j=0;j3;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;i8;i++)

{

if(jud!=tmp[i])

return false;

}

return true;

}

void printa()

{

int t,p;

for(t=0;t3;t++)

{

for(p=0;p3;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;

}


文章名称:c语言数独检查函数 数独问题c语言
标题网址:http://ybzwz.com/article/dodiscs.html