| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4645 人关注过本帖
标题:找到数独解题C源码,有人可以将它换成delphi程序吗?
只看楼主 加入收藏
MyJOB
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2007-12-1
收藏
 问题点数:0 回复次数:4 
找到数独解题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
anthony634
Rank: 6Rank: 6
来 自:西南交大
等 级:贵宾
威 望:24
帖 子:653
专家分:10
注 册:2006-6-8
收藏
得分:0 
我报个名,呵呵。明天有时间的话尝试下.
2007-12-01 13:10
anthony634
Rank: 6Rank: 6
来 自:西南交大
等 级:贵宾
威 望:24
帖 子:653
专家分:10
注 册:2006-6-8
收藏
得分:0 
以前没听过数独,查了下是这样的,有兴趣的朋友可以了解下。转之百度

九宫格数独
[url=http://baike.baidu.com/pic/46/1191769958057632.jpg][/url] 是一种源自18世纪末的瑞士,后在美国发展、并在日本得以发扬光大的数学智力拼图游戏。拼图是九宫格(即3格宽×3格高)的正方形状,每一格又细分为一个九宫格。在每一个小九宫格中,分别填上1至9的数字,让整个大九宫格每一列、每一行的数字都不重复。

数独的玩法逻辑简单,数字排列方式千变万化。不少教育者认为数独是锻炼脑筋的好方法。


[bold]历史[/bold]
原来“Sudoku”起源于瑞士,于1970 年代首先由美国的一家数学逻辑游戏杂志发表,当时名为 Number Place 。现今流行的数独于1984年由日本游戏杂志《パズル通信ニコリ》发表并得了现时的名称。数独本是“独立的数字”的省略,因为每一个方格都填上一个个位数。 后来在日本流行起来。直至 2004 年,曾任香港高等法院法官的高乐德( Wayne Gould )在日本旅行的时候,发现杂志的这款游戏,便带回伦敦向《[url=http://baike.baidu.com/view/218624.htm]泰晤士报[/url]》推介并获得接纳。英国《[url=http://baike.baidu.com/view/1150256.htm]每日邮报[/url]》也于三日后开始连载,使“数独”在英国正式掀起热潮,成为英国当下的流行游戏。其他国家和地区受其影响也开始连载“数独”。现在在几个国家的任何一个书店都可以看到“数独"游戏小册子,还有“ 数独”年历、“数独”游戏机等。


[bold]解法举例[/bold]
先注意其中一个方格,限定该方格内可以填写的数字。
注意其中一列(或者其中一个小九宫格),寻找填写某数字的方格。
学过“资料结构”的人,可以尝试用Backtrack试试。
数独的通解方法及步骤:

根据以下方法可以确保最终得到数独的解,而且通过手工运算的时间基本可以控制在1.5个小时,不论难易程度,所以此方法可以作为取得数独答案的一般解法。
1、根据横列、竖列和方格的限制条件排除各个点不可能的数字,并从1-9将各个可能的数字用小字体逐个写进每个空白的格子。(该步骤大约需要15-20分钟,这是求解的初始,务必确保没有遗漏)。

2、审视第一步骤的结果,如果发现某个空格只有一个数字,即确定该空格为这个数字。并根据该数字审视其相关的横列、竖列和方格,并划除相同的数字。(该情况出现的可能往往不多,除了较简单的数独题,但这是一个必要的过程,而且在随后的过程中要反复使用此方法。)

3、审视各个横列、竖列和方格中罗列出的可能的数字结果,若发现某一个数字在各个横列、竖列或方格中出现的次数仅一次,则可以确定该空格的解为此数字。并根据第二条的方法排除与此空格相关列或方格中相同的数字。

4、审视各个横列、竖列和方格中罗列的各个可能的结果,找出相对称的两个数组合的空格(或3个、4个组合),并确定这两个空格(或3个、4个)的数字只可能为这两个数字,即两个数字在这两个空格的位置可以交换,但不可能到该行、该列或该方格的其他位置。根据此结果可以排除相关列或方格罗列出相关数字的可能,并缩小范围。(该步骤处理的难度相对复杂,需要在积累一定经验的基础上进行,也是最终求解的关键)

5、反复使用2、3、4提到的步骤,逐步得到一个一个空格的解,并将先前罗列的各种可能的结果一个一个排除,使可能的范围越来越小,直至得到最后结果。

2007-12-01 13:12
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
nihg
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2007-12-24
收藏
得分:0 
数独游戏delphi源码
研砉程序园
[url]http://www.[/url]
2007-12-24 22:22
快速回复:找到数独解题C源码,有人可以将它换成delphi程序吗?
数据加载中...
 
   



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

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