C语言只能实现解数独程序

C语言只能实现解数独程序

这篇文章主要介绍“C语言只能实现解数独程序”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言只能实现解数独程序”文章能帮助大家解决问题。

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

效果如图:

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

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

程序源码如下:

#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);elseprintf("%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);elsefor(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语言只能实现解数独程序”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注恰卡编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

发布于 2022-04-03 22:35:46
分享
海报
19
上一篇:c语言怎么获取当前日期和时间 下一篇:C语言如何实现音乐播放器
目录

    忘记密码?

    图形验证码