国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C > 正文

C語(yǔ)言解數(shù)獨(dú)程序的源碼

2020-01-26 13:33:32
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

用C語(yǔ)言寫(xiě)的解數(shù)獨(dú)的程序。在linux下測(cè)試成功運(yùn)行。

效果如圖:

這是帶解的數(shù)獨(dú),需要填寫(xiě)的部分用數(shù)字0代替。

這是程序運(yùn)行后的效果圖。看看,數(shù)獨(dú)已經(jīng)搞定啦。

程序源碼如下:

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 中西区| 丽水市| 图片| 丰城市| 藁城市| 望江县| 循化| 漳浦县| 长宁县| 富蕴县| 南丹县| 通化县| 台山市| 合阳县| 中阳县| 波密县| 隆化县| 大庆市| 肇州县| 东光县| 双峰县| 阳信县| 肇州县| 凤冈县| 磐安县| 桐城市| 通州区| 涿鹿县| 肇源县| 商城县| 梁山县| 龙江县| 伊宁市| 新河县| 蓬莱市| 五大连池市| 抚松县| 潮州市| 高唐县| 新巴尔虎左旗| 永康市|