c语言数独函数 c语言解数独

c语言 编程 数独

当年我们做大程的时候本来也想做数独来着,后来时间不够没做成.不知道专业人士怎么编的,只能提供一点当时的思路给你,

新乡县网站制作公司哪家好,找成都创新互联公司!从网页设计、网站建设、微信开发、APP开发、成都响应式网站建设公司等网站项目制作,到程序开发,运营维护。成都创新互联公司2013年开创至今到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选成都创新互联公司

1.9*9个格子对应一个数组A,数组的第一个值从0到9表示其中填的数字,0就是不填,另一个值表示它在桌面上的位置就是坐标

2.需要10张图片,空白和9个数字

3.通过对鼠标点击的反应改变格子数组A的值,且将相应图片覆盖在相应坐标上

4.事先输入若干组数组A的值(每组81个数),作为题库

5.进行游戏时随机抽取题库中的一组,再随机抽取若干格子显示出来,其他留白.

6.填完后用三个循环判断下每行每列每块是否有相同的数字,没有则通过.

具体编按钮、放图、鼠标点击响应等各种问题查一下书,有很多书上有很多教的这种一小段一小段的程序源代码,直接抄下就行了。

加油^^

用C语言怎么解数独

#include stdio.h  

#include stdlib.h  

#define SIZE 9  

#define get_low_bit(x) ((~x(x-1))+1)  

struct{  

int left;  

char num;     

char try;  

}board[SIZE][SIZE];  

int bit2num(int bit)  

{  

switch(bit){  

case 1:case 2:  

return bit;   

case 4:  

return 3;  

case 8:  

return 4;  

case 16:  

return 5;  

case 32:  

return 6;     

case 64:          

return 7;     

case 128:  

return 8;     

case 256:  

return 9;  

}     

}  

void printf_res()  

{  

int i, j, k;      

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

{  

if(i%3==0)    

{  

for(j=0; jSIZE*2+4; j++)  

putchar('-');  

putchar('\n');  

}         

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

{  

if(j%3==0)  

putchar('|');  

if(board[i][j].num  0)  

printf("\033[0;31m%2d\033[0m", board[i][j].num);  

else  

printf("%2d", board[i][j].try);  

}     

printf("|\n");  

}  

for(i=0; iSIZE*2+4; i++)  

putchar('-');  

putchar('\n');  

}  

void sub(int i, int j, int bit)  

{  

int k, m;     

for(k=0; kSIZE; k++)  

{  

board[k][j].left = ~bit;  

board[i][k].left = ~bit;  

}         

for(k=i/3*3; k(i/3+1)*3; k++)  

for(m=j/3*3; m(j/3+1)*3; m++)  

board[k][m].left = ~bit;     

}  

void init()  

{  

int i, j;     

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

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

if(board[i][j].num  0)  

sub(i, j, 1(board[i][j].num-1));  

else if(board[i][j].try  0)  

sub(i, j, 1(board[i][j].try-1));  

}  

void add(int i, int j, int bit)  

{  

int k, m;  

for(k=0; kSIZE; k++)  

{  

board[k][j].left |= bit;  

board[i][k].left |= bit;  

}  

for(k=i/3*3; k(i/3+1)*3; k++)  

for(m=j/3*3; m(j/3+1)*3; m++)  

board[k][m].left |= bit;  

}  

void solve(int pos)  

{  

int i=pos/SIZE;   

int j=pos%SIZE;   

int bit, left;  

if(pos == SIZE*SIZE)  

{  

printf_res();  

exit(0);          

}  

if(board[i][j].num  0)  

solve(pos+1);     

else  

for(left=board[i][j].left; left; left=(left-1))  

{  

bit = get_low_bit(left);  

sub(i, j, bit);  

board[i][j].try = bit2num(bit);  

solve(pos+1);  

add(i, j, bit);  

board[i][j].try=0;  

init();       

}         

}  

int main()  

{  

int i, j, c;  

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

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

{  

while((c=getchar())'0' || c'9')  

;  

board[i][j].num = c-'0';  

board[i][j].try = 0;  

board[i][j].left = 0x0001FF;          

}                 

init();  

solve(0);  

return 0;  

}

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://myzitong.com/article/dohhjsg.html