91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言如何實現解數獨程序

發布時間:2021-06-12 19:18:08 來源:億速云 閱讀:121 作者:小新 欄目:編程語言

這篇文章主要為大家展示了“C語言如何實現解數獨程序”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“C語言如何實現解數獨程序”這篇文章吧。

用C語言寫的解數獨的程序。在linux下測試成功運行。

效果如圖:

這是帶解的數獨,需要填寫的部分用數字0代替。

C語言如何實現解數獨程序

這是程序運行后的效果圖。看看,數獨已經搞定啦。

C語言如何實現解數獨程序

程序源碼如下:

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

以上是“C語言如何實現解數獨程序”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

广元市| 乐山市| 庆阳市| 雅安市| 南汇区| 卓资县| 察哈| 沙坪坝区| 临江市| 德令哈市| 澄城县| 钟山县| 瑞昌市| 英吉沙县| 乐山市| 漳州市| 威宁| 富顺县| 彭泽县| 宁明县| 石屏县| 巴林左旗| 巧家县| 大埔区| 垣曲县| 嵊泗县| 井研县| 安阳市| 礼泉县| 万州区| 神农架林区| 天台县| 滦平县| 客服| 开阳县| 陵水| 西昌市| 陆河县| 六安市| 平山县| 南召县|