首页 > 编程 > C > 正文

C语言解数独程序的源码

2020-01-26 13:33:32
字体:
来源:转载
供稿:网友

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

效果如图:

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

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

程序源码如下:

#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; 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');} void sub(int i, int j, int bit){ int k, 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; } void init(){ int i, 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));  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; 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;} 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<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);  return 0;}

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选