| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4650 人关注过本帖
标题:找到数独解题C源码,有人可以将它换成delphi程序吗?
取消只看楼主 加入收藏
MyJOB
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2007-12-1
收藏
 问题点数:0 回复次数:1 
找到数独解题C源码,有人可以将它换成delphi程序吗?
兄弟看到对数独解题的C源程序,很有兴趣,但兄弟对C不熟,有朋友可以帮我转成delphi的程序吗?
这个源程序在C里可以通过,但是是在DOS下运行的,想学习它的解题思路和实现方法,有人有兴趣吗?
C 語言原始碼
#include < stdio.h >
#include < stdlib.h >

int sudoku[81] ; // 數獨題目陣列
int tempNum[81] ; // 上一次填數位置
int tempSp= 0 ; // 上一次填數位置指標
int startH[81] ; // 列位置的起點
int startV[81] ; // 行位置的起點
int startB[81] ; // 九宮格位置的起點
int addH[9] ; // 列位置的加值
int addV[9] ; // 行位置的加值
int addB[9] ; // 九宮格位置的加值

int main(int argc, char *argv[]) {
int j ;
if(argc>1) for(j=0; j<81; j++) sudoku[j]= argv[1][j]-'0' ;
else exit(0) ;
printf( "----------\n");
printSudoku(sudoku) ;
init() ; // 參數設定
tryAns() ; // 測試求解
printf( "----------\n");
printSudoku(sudoku) ;
printf( "----------\n");
}

int init() {
// 參數設定(設定這些參數之後,無論檢查行、列、九宮格都方便多了)
int i ;
for(i=0; i<81; i++) {
startH[i]= i/9* 9 ; // 列位置的起點
startV[i]= i% 9 ; // 行位置的起點
startB[i]= ((i/9)/3)*27+ ((i%9)/3)*3 ; // 九宮格位置的起點
}
for(i=0; i<9; i++) {
addH[i]= i ; // 列位置的加值
addV[i]= i*9 ; // 行位置的加值
addB[i]= (i/3)*9+ (i%3) ; // 九宮格位置的加值
}
}

int printSudoku(int *prn) {
// 印出數獨題目(陣列內容)
int i ;
for(i=0; i<81; i++) {
printf( "%2d", prn[i]);
if(i%9==8) printf("\n");
}
}

int tryAns() {
// 測試求解
int sp=getNextBlank(-1) ; // 取得第一個空白的位置開始填入數字
do {
sudoku[sp]++ ; // 將本位置數字加 1
if(sudoku[sp]>9) { // 如果本位置的數字已大於 9 時則回到上一個位置繼續測試
sudoku[sp]= 0 ;
sp= pop() ;
} else {
if(check(sp)==0) { // 如果同行、列、九宮格都沒有相同的數字,則到下一個空白處繼續
push(sp) ; // 當然,如果發現有相同的數字時,就需把原位置的數字加 1(所以本處什麼都不做)
sp= getNextBlank(sp) ;
}
}
} while(sp>=0 && sp<81) ;
}

int getNextBlank(int sp) {
// 取得下一個空白的位置
do {
sp++ ;
} while(sp<81 && sudoku[sp]>0) ;
return(sp) ;
}

int check(int sp) {
// 檢查同行、列、九宮格有沒有相同的數字,若有傳回 1
int fg= 0 ;
if(!fg) fg= check1(sp, startH[sp], addH) ; // 檢查同列有沒有相同的數字
if(!fg) fg= check1(sp, startV[sp], addV) ; // 檢查同行有沒有相同的數字
if(!fg) fg= check1(sp, startB[sp], addB) ; // 檢查同九宮格有沒有相同的數字
return(fg) ;
}

int check1(int sp, int start, int *addnum) {
// 檢查指定的行、列、九宮格有沒有相同的數字,若有傳回 1
int fg= 0, i, sp1 ;
for(i=0; i<9; i++) {
sp1= start+ addnum[i] ;
if(sp!=sp1 && sudoku[sp]==sudoku[sp1]) fg++ ;
}
return(fg) ;
}

int push(int sp) {
// 將指定的位置放入堆疊中
tempNum[tempSp++]= sp ;
}

int pop() {
// 取出堆疊中的上一個位置
if(tempSp<0) return(-1) ;
else return(tempNum[--tempSp]) ;
}
搜索更多相关主题的帖子: delphi 源码 解题 
2007-12-01 10:11
MyJOB
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2007-12-1
收藏
得分:0 
我也转一篇简介

數獨簡介
簡介
    [*]「數獨sudoku」來自日文,但概念源自「拉丁方塊」,是十八世紀瑞士數學家歐拉發明的。遊戲規則很簡單: 在九個九宮格裡,填入1到9的數字,讓每個數字在每個行、列及九宮格裡都只出現一次。謎題中會預先填入 若干數字,其他宮位則留白,玩家得依謎題中的數字分布狀況,邏輯推敲出剩下的空格裡是什麼數字。你還沒 玩過嗎?本網站中有一個線上的數獨遊戲程式,各位可以連結過去玩玩看,保證你一玩就上癮,樂在其中哦![*]這種風靡日本及歐美的「數獨sudoku」,據說原創者是18世紀的瑞士人,但沒有得到應有的注目,直到20多年 前,美國人重新挖掘它的魅力,接著日本雜誌出版商在八○年代末期在一本美國雜誌上看到這個遊戲,帶回日 本後,增加它的遊戲難度,並命名為「數獨sudoku」,「數獨」謎戲於焉誕生,並逐漸受到日本人的注意、沉 迷,日本坊間書局還出版了許多「數獨」的書。紐西蘭裔英籍退休法官韋恩.古德(Wayne Gould)一九九七 年旅遊日本時,買了一本數獨遊戲書,從此就迷上了,進而研究出電腦程式,從去年開始供稿給全球十幾家報 社,立即受到讀者的熱烈回響,邀他供稿的媒體還正不斷增加中;據說,「數獨」還成為英國報紙銷售量的法 寶,連美國紐約時報也無法阻擋它的魅力,開始定期登載。94年5月30日起,台灣的中國時報也取得古德的授權 ,每天都刊出一則數獨謎題,讓這個新玩意第一次出現在台灣的大眾媒體上,也是全球第一家引入數獨遊戲的 中文報紙。[*]方格裡擺幾個數字,乍看之下好像沒什麼。但數獨好玩之處,就在其中推推敲敲的過程,以及解答出來的成就 感。自從台灣引進數獨後,玩過的人都說好玩,除非根本沒玩過,否則沒有聽過玩過之後覺得不好玩的。由於 規則簡單,卻變化無窮,在推敲之中完全不必用到數學計算,只需運用邏輯推理能力,所以無論老少中青男女 ,人人都可以玩。而且容易入手、容易入迷,一玩就上癮。只需九個九宮格,及1到9不重複的阿拉伯數字,也 超越了文字的障礙,因此自從出現後,從東方到西方,風靡億萬人。有些人認為玩數獨是他們紓解工作壓力的 最佳方式;有些人認為玩數獨可以保持頭腦靈活,尤其適合老年人;也有些老師和父母覺得玩數獨需要耐心、 專心和推理能力,所以拿數獨當題目出給學生練習,用來訓練小孩子。最近英國政府出資的「教師」雜誌甚至 建議把「數獨」引進課堂,因為數獨不僅有趣好玩,還可以增進玩者的推理與邏輯機能,所以可以作為學生鍛 鍊腦力的教材喔![*]數獨到底有多大的魅力呢?只要上網使用任何一個搜尋引擎鍵入"sudoku"或"數獨"後進行搜尋,千百萬個符合 的網頁將被條列出來,有些是專業的網站,更多的是玩家發表玩後心得或感想的討論,看過之後,你就不會認 為本文言過其實了。
填製規則
    [*]數獨的遊戲規則很簡單:在九個九宮格裡,填入1到9的數字,讓每個數字在每個行、列及九宮格裡都 只出現一次就可以過關了![*]雖然遊戲的規則十分簡單,但很多人在沒有電腦輔助時,常常會不小心造成下列違規狀況:
    同一列出現了兩個一樣的數字。
    同一行出現了兩個一樣的數字。
    同一個九宮格出現了兩個一樣的數字。
    [*]謎題中會預先填入若干數字,其他宮位則留白,玩家得依謎題中的數字分布狀況,邏輯推敲出剩下的 空格裡是什麼數字。例:<圖 1> 就是一個簡易級的數獨謎題。
    < 圖 1> 一個簡易級的數獨謎題
    [*]雖然<圖 1>的數獨被歸類為簡易級,但如果你是個數獨新手,可不要被簡易兩字給迷惑了!請先有個心理準備: 如果在 1 小時之內解得出來,哇,那你是天才!花了九年二虎之力後解不出來,這是正常的。不過別擔心、灰 心,只要你稍微了解一下常用的解謎技巧,像<圖 1>這類簡易級的題目馬上就再也難不倒你了!
位置表示法
    為了往後說明時指位的方便,請先了解本網站的指位法: [*]列:橫向的九個宮格排成一直線是為列,數獨共有九列,最上面的一列是第1列,然後是第2列、 第3列、......,最下方的一列是第9列。
    [*]行:縱向的九個宮格排成一直線是為行,數獨共有九行,最左邊的一行是第1行,然後是第2行、 第3行、......,最右邊的一行是第9行。
    [*]九宮格:數獨是由9個九宮格所組成。這九個九宮格分別稱為上左、上中、上右、中左、中央、 中右、下左、下中、下右九宮格。
    [*]宮格:數獨共有81個宮格,為了指出指定的宮格,特以(列,行)的座標表示法來定位, 例如(3,5)就是第3列第5行的宮格;(7,6)表示第7列第6行的宮格。
解謎技巧
    [*]數獨的解謎技巧,可大分為直觀法及候選數法兩種。[*]直觀法的特性:
      [*]不需任何輔助工具就可應用。所以要玩報章雜誌上的數獨謎題時,只要有一枝筆就可以開始了。[*]從接到數獨謎題的那一刻起就可以立即開始解題。[*]初學者或沒有電腦輔助時的首要解題方法。[*]相對而言,能解出的謎題較簡單。[*]主要的技巧:唯一解法、基礎摒除法、區塊摒除法、唯餘解法、矩形摒除法、單元摒除法。
    [*]候選數法的特性:
      [*]需先建立候選數列表,所以要玩報章雜誌上的數獨謎題時,因篇幅的影響通常格子不會太大,且候選數列表 的建立十分繁瑣,所以常需電腦輔助,或使用候選數法的輔助解題用紙。[*]需先建立候選數列表,所以從接到數獨謎題的那一刻起,需經過一段相當的時間才會出現第 1 個解。[*]需使用高階直觀法技巧或有電腦輔助時的首要解題方法。[*]相對而言,能解出的謎題較複雜。[*]主要的技巧:唯一候選數法(Singles Candidature)、隱性唯一候選數法(Hidden Singles Candidature)、 區塊刪減法(Locked Candidates)、數對刪減法(Naked Pairs)、隱性數對刪減法(Hidden Pairs)、 三鏈數刪減法(Naked Triples)、隱性三鏈數刪減法(Hidden Triples)、矩形頂點刪減法(X-Wing)、 三鏈列刪減法(Swordfish)、關鍵數刪減法(Colors, Colouring)、關連數刪減法(Forcing chains)。
    [*]數獨的解謎技巧,剛開始發展時,以人性的直觀式解法為主,對於初入門的玩家來說,這也是 較容易理解、接受的方法;其實就算是資深的玩家,當手邊沒有電腦協助更新候選數列表時,大多數仍會選擇 採用本法,因為候選數列表的建立及更新若採用手動方式操作,一來十分繁瑣,二來十分容易出錯,而候選數法 對於候選數列表的正確性要求是不容有一點誤差的。一般報章雜誌上的數獨謎題為了迎合大眾程度,大抵均屬 簡易級或中級,如果能靈活運用直觀法,通常已游刃有餘。但若是網站上的數獨謎題,則常是需用到候選數法 才能解出的。
2007-12-02 00:39
快速回复:找到数独解题C源码,有人可以将它换成delphi程序吗?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025135 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved