最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2019年01月21日 09:42:13   作者:odaynot  
這篇文章主要為大家詳細(xì)介紹了C語言解數(shù)獨(dú)程序的源碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

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

效果如圖:

這是帶解的數(shù)獨(dú),需要填寫的部分用數(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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 帶你了解C++中vector的用法

    帶你了解C++中vector的用法

    大家好,本篇文章主要講的是帶你了解C++中vector的用法,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • C++ Vector 動(dòng)態(tài)數(shù)組的實(shí)現(xiàn)

    C++ Vector 動(dòng)態(tài)數(shù)組的實(shí)現(xiàn)

    這篇文章主要介紹了C++ Vector 動(dòng)態(tài)數(shù)組的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • C語言超詳細(xì)講解指針與結(jié)構(gòu)體

    C語言超詳細(xì)講解指針與結(jié)構(gòu)體

    指針提供了對(duì)地址操作的一種方法,因此,使用指針可使得C語言能夠更高效地實(shí)現(xiàn)對(duì)計(jì)算機(jī)底層硬件的操作。另外,通過指針可以更便捷地操作數(shù)組。C數(shù)組允許定義可存儲(chǔ)相同類型數(shù)據(jù)項(xiàng)的變量,結(jié)構(gòu)是C編程中另一種用戶自定義的可用的數(shù)據(jù)類型,它允許您存儲(chǔ)不同類型的數(shù)據(jù)項(xiàng)
    2022-05-05
  • C++入門之模板基礎(chǔ)講解

    C++入門之模板基礎(chǔ)講解

    這篇文章主要為大家介紹了C++入門之模板基礎(chǔ),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • C++標(biāo)準(zhǔn)庫(kù)介紹及使用string類的詳細(xì)過程

    C++標(biāo)準(zhǔn)庫(kù)介紹及使用string類的詳細(xì)過程

    C++中將string封裝為單獨(dú)的類,string?類是?C++?標(biāo)準(zhǔn)庫(kù)中的一個(gè)非常重要的類,用于表示和操作字符串,這篇文章主要介紹了C++標(biāo)準(zhǔn)庫(kù)介紹及使用string類,需要的朋友可以參考下
    2024-08-08
  • C++設(shè)計(jì)模式之建造者模式(Builder)

    C++設(shè)計(jì)模式之建造者模式(Builder)

    這篇文章主要介紹了C++設(shè)計(jì)模式之建造者模式Builder的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • 一起聊聊C++中的智能指針

    一起聊聊C++中的智能指針

    C++?是手工管理內(nèi)存的分配和釋放,這給了程序員極大的自由度也給了我們極高的門檻,弄不好就得內(nèi)存泄露。使用智能指針能更好的管理堆內(nèi)存,本文主要給大家介紹一下c++的智能指針,需要的朋友可以參考下
    2022-07-07
  • C++字符串拼接效率對(duì)比(+=、append、stringstream、sprintf)

    C++字符串拼接效率對(duì)比(+=、append、stringstream、sprintf)

    這篇文章主要介紹了C++字符串拼接效率對(duì)比(+=、append、stringstream、sprintf),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 利用Matlab制作三子棋游戲的示例代碼

    利用Matlab制作三子棋游戲的示例代碼

    三子棋是一種民間傳統(tǒng)游戲,又叫九宮棋、圈圈叉叉、一條龍、井字棋等。將正方形對(duì)角線連起來,相對(duì)兩邊依次擺上三個(gè)雙方棋子,只要將自己的三個(gè)棋子走成一條線,對(duì)方就算輸了。本文將用Matlab制作這一經(jīng)典游戲,感興趣的可以試一試
    2022-03-03
  • C++與QML進(jìn)行數(shù)據(jù)交互實(shí)現(xiàn)方式介紹

    C++與QML進(jìn)行數(shù)據(jù)交互實(shí)現(xiàn)方式介紹

    迫于無奈開始寫android的程序,以前使用QWidget的方式試過,雖然界面可以實(shí)現(xiàn),但是最后調(diào)用攝像頭時(shí),未能成功,再?zèng)]有繼續(xù)。這幾天開始使用qml進(jìn)行嘗試,在使用的過程中,其中的一個(gè)難點(diǎn),就是在qml與c++中數(shù)據(jù)的交互
    2022-09-09

最新評(píng)論

商南县| 昭苏县| 射阳县| 容城县| 辰溪县| 姚安县| 舒兰市| 望江县| 新田县| 新乡县| 云霄县| 孟州市| 南京市| 岳西县| 交城县| 乌苏市| 惠州市| 余江县| 密山市| 怀仁县| 兰州市| 永川市| 都江堰市| 温宿县| 清丰县| 甘南县| 普洱| 留坝县| 远安县| 五台县| 咸宁市| 达尔| 平邑县| 沙河市| 霍邱县| 新源县| 化德县| 蒙阴县| 西昌市| 顺义区| 大庆市|