数独c语言程序设计思路,C语言解数独程序的源码

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

效果如图:

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

a8d60338b8564ee0342d3b7b46425824.png

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

8cd69590bea773d4c4ce2fb1db776117.png

程序源码如下:

#include

#include

#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; i

{

if(i%3==0)

{

for(j=0; j

putchar('-');

putchar('\n');

}

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

putchar('-');

putchar('\n');

}

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

{

int k, m;

for(k=0; k

{

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

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

}

for(k=i/3*3; k

for(m=j/3*3; m

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

}

void init()

{

int i, j;

for(i=0; i

for(j=0; j

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

sub(i, j, 1<

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

sub(i, j, 1<

}

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

{

int k, m;

for(k=0; k

{

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

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

}

for(k=i/3*3; k

for(m=j/3*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; i

for(j=0; j

{

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

;

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

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

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

}

init();

solve(0);

return 0;

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值