C语言如何实现解数独程序

这篇文章主要为大家展示了“C语言如何实现解数独程序”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C语言如何实现解数独程序”这篇文章吧。

用C语言写的解数独的程序。在linux下测试成功运行。

效果如图:

这是带解的数独,需要填写的部分用数字0代替。

C语言如何实现解数独程序

这是程序运行后的效果图。看看,数独已经搞定啦。

C语言如何实现解数独程序

程序源码如下:

#include<stdio.h>
#include<stdlib.h>

#defineSIZE9
#defineget_low_bit(x)((~x&(x-1))+1)

struct{
intleft;
charnum;
chartry;
}board[SIZE][SIZE];

intbit2num(intbit)
{
switch(bit){
case1:case2:
returnbit;
case4:
return3;
case8:
return4;
case16:
return5;
case32:
return6;
case64:
return7;
case128:
return8;
case256:
return9;
}
}

voidprintf_res()
{
inti,j,k;

for(i=0;i<SIZE;i++)
{
if(i%3==0)
{
for(j=0;j<SIZE*2+4;j++)
putchar('-');
putchar('\n');
}

for(j=0;j<SIZE;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;i<SIZE*2+4;i++)
putchar('-');
putchar('\n');
}

voidsub(inti,intj,intbit)
{
intk,m;

for(k=0;k<SIZE;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;
}

voidinit()
{
inti,j;

for(i=0;i<SIZE;i++)
for(j=0;j<SIZE;j++)
if(board[i][j].num>0)
sub(i,j,1<<(board[i][j].num-1));
elseif(board[i][j].try>0)
sub(i,j,1<<(board[i][j].try-1));
}

voidadd(inti,intj,intbit)
{
intk,m;

for(k=0;k<SIZE;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;
}

voidsolve(intpos)
{
inti=pos/SIZE;
intj=pos%SIZE;
intbit,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();
}
}

intmain()
{
inti,j,c;

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

return0;
}

以上是“C语言如何实现解数独程序”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注恰卡编程网行业资讯频道!

发布于 2021-06-13 23:20:41
收藏
分享
海报
0 条评论
179
上一篇:C语言怎么实现简易版flappy bird小游戏 下一篇:怎么在java虚拟机中实现多线程
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码