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頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...