歡迎使用CSDN markdown編輯器

2021-07-02 05:48:29 字數 3032 閱讀 8265

40年前,獲得乙個數學學位後,在父親的忠告下我繼續深造電腦科學。他說這裡有未來。後來事實證明,他是對的。我最後的乙個專案是數年前用c++寫的數獨,或許這也說明我過時了。目前我的孩子都在it圈內,兩個畢業於mit。其中乙個拿起一本書給我看,上面寫著:「想要更上一層樓,你該學習haskell。」我想,有一天這會是我退休時的讀物。

這是摘自新加坡總理李顯龍的一段演講。

李顯龍c++寫的數獨程式:

int inblock[81], inrow[81], incol[81];

const int blank = 0;

const int ones = 0x3fe; // binary 1111111110

int entry[81];// records entries 1-9 in the grid, as the corresponding bit set to 1

int block[9], row[9], col[9];// each int is a 9-bit array

int seqptr = 0;

int sequence[81];

int count = 0;

int levelcount[81];

void swapseqentries(int s1,int s2)

int temp = sequence[s2];

sequence[s2] = sequence[s1];

sequence[s1] = temp;

void initentry(int i, int j, int val)

int square = 9 * i + j;

int valbit = 1 << val;

int seqptr2;

// add suitable checks for data consistency

entry[square] = valbit;

block[inblock[square]] &= ~valbit;

col[incol[square]] &= ~valbit; // ******r col[j] &= ~valbit;

row[inrow[square]] &= ~valbit; // ******r row[i] &= ~valbit;

seqptr2 = seqptr;

while (seqptr2 < 81 && sequence[seqptr2] != square)

seqptr2++ ;

swapseqentries(seqptr, seqptr2);

seqptr++;

void printarray()

int i, j, valbit, val, square;

char ch;

square = 0;

for (i = 0; i < 9; i++)

}putc(ch,stdout);

}putc ('\n', stdout);

}

void consoleinput()

int i, j;

char inputstring[80];

for (i = 0; i < 9; i++)

}printarray();

void printstats()

int i, j, s;

printf("\nlevel counts:\n\n");

s = 0;

while (levelcount[s] == 0) s++;

i = 0;

while (s < 81)

s++;

}printf("\n\ncount =%d\n", count);

void succeed()

printarray();

printstats();

int nextseq(int s)

int s2, square, possibles, bitcount;

int t, minbitcount = 100;

for (t = s; t < 81; t++)

if (bitcount < minbitcount)

}

return s2;

void place(int s)

levelcount[s]++;

count++;

if (s >= 81)

int s2 = nextseq(s);

swapseqentries(s, s2);

int square = sequence[s];

int blockindex = inblock[square],

rowindex = inrow[square],

colindex = incol[square];

int possibles = block[blockindex] & row[rowindex] & col[colindex];

while (possibles)

swapseqentries(s, s2);

int main(int argc, char* argv)

int i, j, square;

for (i = 0; i < 9; i++)

for (j = 0; j < 9; j++)

for (square = 0; square < 81; square++)

for (i = 0; i < 9; i++)

block[i] = row[i] = col[i] = ones;

consoleinput();

place(seqptr);

printf("\n\ntotal count =%d\n", count);

return 0;

歡迎使用CSDN markdow

本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦 markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...

歡迎毛毛與妞妞使用CSDN markdown編輯器

建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下mar...

歡迎使用CSDN markdow1n編輯器

本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦 markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...