




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、From GossipcaterpillarAlgorithm Gossip:騎士走棋盤說明騎士旅遊(Knight tour )在十八世紀(jì)初倍受數(shù)學(xué)家與拼圖迷的注意,它什麼時(shí)候被提岀已不可考,騎士的走法為西洋棋的走法,騎士可以由任一個(gè)位置岀發(fā),它要如何走完所有的位置?解法騎士的走法,基本上可以使用遞迴來解決,但是純綷的遞迴在維度大時(shí)相當(dāng)沒有效率,一個(gè)聰明的解法由J.C. Warnsdorff在1823年提岀,簡單的說,先將最難的位置走完,接下來的路就寬廣 了,騎士所要走的下一步,為下一步再選擇時(shí),所能走的步數(shù)最少的一步。,使用這個(gè)方法,在不使用遞迴的情況下,可以有較高的機(jī)率找岀走法(找不到走法
2、的機(jī)會(huì)也是有的)。演算法FOR(m = 2; m <= 總步數(shù);m+)測試下一步可以走的八個(gè)方向,記錄可停留的格數(shù)cou ntIF(cou nt = 0)遊歷失敗ELSE IF(cou nt = 1)下一步只有一個(gè)可能ELSE 找出下一步的出路最少的格子如果出路值相同,則選第一個(gè)遇到的出路。走最少出路的格子,記錄騎士的新位置。實(shí)作#i nclude <stdio.h>int board88 = 0;int main(v oid) int startx, starty;int i, j;prin tf("輸入起始點(diǎn):");scanf("%d %d&
3、quot;, &startx, &starty);if(travel(startx, starty) printf("遊歷完成! n");else printf("遊歷失??! n");for(i = 0; i < 8; i+) for(j = 0; j < 8; j+) prin tf("%2d ", boardij); putchar('n');return 0;int travel( int x, int y) /對應(yīng)騎士可走的八個(gè)方向int ktmove18 = -2, -1,1,2,
4、 2,1, -1, -2;int ktmove28 = 1,2, 2, 1, -1, -2, -2, -1;/測試下一步的出路int nexti8 = 0;int nextj8 = 0;/記錄出路的個(gè)數(shù)int exists8 = 0;int i, j, k, m, l;int tmpi, tmpj;int count, min, tmp;i = x;j = y;boardij = 1;for(m = 2; m <= 64; m+) for(l = 0; l < 8; l+) existsl = 0;l = 0;/試探八個(gè)方向for(k = 0; k < 8; k+) tmpi
5、 = i + ktmove1k;tmpj = j + ktmove2k;/如果是邊界了,不可走> 7 | tmpj >if(tmpi < 0| tmpj < 0 | tmpi7)con ti nue;/如果這個(gè)方向可走,記錄下來if(boardtmpitmpj = 0) n extil = tmpi;n extjl = tmpj;/可走的方向加一個(gè)I+;count = l;/如果可走的方向?yàn)?個(gè),返回if(co unt = 0) return 0;else if(co unt = 1) /只有一個(gè)可走的方向/所以直接是最少出路的方向min = 0;else /找出下一個(gè)
6、位置的出路數(shù)for(l = 0; l < cou nt; I+) for(k = 0; k < 8; k+) tmpi = n extil + ktmove1k;tmpj = n extjl + ktmove2k;if(tmpi < 0 | tmpj < 0 |tmpi > 7 | tmpj > 7) con ti nue;if(boardtmpitmpj = 0) existsl+;tmp = exists0;min = 0;/從可走的方向中尋找最少出路的方向for(l = 1; l < count; l+) if(existsl < tmp)
7、 tmp = existsl;min = l;/ 走最少出路的方向i = n exti min;j = n extjmi n;boardij = m;return 1;« Javapublic class Kni ght public boolea n travel( int startX,int startY, i nt叩 board) /對應(yīng)騎士可走的八個(gè)方向in t ktmove1 = -2, -1, 1,2, 2, 1, -1, -2;int ktmove2 = 1,2, 2, 1, -1, -2, -2, -1;/下一步出路的位置in t n exti = new in t
8、board .len gth;in t n extj = new in tboard .len gth;/記錄出路的個(gè)數(shù)in t exists = new in tboard .len gth;int x = startX;int y = startY;boardxy = 1;for(int m = 2; m <= Math.pow(board.length, 2); m+) for(i nt k = 0; k < board .len gth; k+) existsk = 0;int count = 0;/試探八個(gè)方向for(i nt k = 0; k < board .l
9、en gth; k+) int tmpi = x + ktmove1k;int tmpj = y + ktmove2k;/如果是邊界了,不可走if(tmpi < 0 | tmpj < 0 |tmpi > 7 | tmpj > 7) con ti nue;/如果這個(gè)方向可走,記錄下來if(boardtmpitmpj = 0) n extico unt = tmpi;n extjco unt = tmpj;/可走的方向加一個(gè)coun t+;int min = -1;if(co unt = 0) return false;else if(co unt =1) min = 0;
10、else /找出下一個(gè)位置的出路數(shù)for(int l = 0; l< coun t; l+) k+)for(i nt k= 0; k < board .len gth;int tmpi = n extil + ktmove1k;int tmpj = n extjl + ktmove2k;if(tmpi < 0 | tmpj < 0 |tmpi > 7 | tmpj > 7) con ti nue;if(boardtmpitmpj = 0) existsl+;int tmp = exists0;min = 0;/從可走的方向中尋找最少出路的方向for(int
11、l = 1; l < count; l+) if(existsl < tmp) tmp = existsl;min = l;/走最少出路的方向x = n exti min;y = n extjmi n;boardxy = m;return true;public static void main( Stri ng args) in t board = new in t88;Kni ght kni ght = new Kni ght();if(kni (In teger.parsel nt(args0).In teger.parse In t(args1), board) System.out.pri ntln (”遊歷完成!");else System.out.pri ntln (”遊歷失?。?quot;);for(int i = 0; i < board.length; i+) for(int
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 傳媒公司協(xié)議合同范本
- 制作簡易合同范本
- 農(nóng)戶貸款保證合同范本
- 農(nóng)村住宅設(shè)計(jì)合同范本
- 上海植物租擺合同范本
- 公積金租房合同范本
- 五人合伙合同范本
- 二手公寓房購買合同范本
- 正規(guī)合同范本買賣
- 倉庫貨品保管合同范本
- GB/T 3452.2-2007液壓氣動(dòng)用O形橡膠密封圈第2部分:外觀質(zhì)量檢驗(yàn)規(guī)范
- GB/T 30797-2014食品用洗滌劑試驗(yàn)方法總砷的測定
- GB/T 20057-2012滾動(dòng)軸承圓柱滾子軸承平擋圈和套圈無擋邊端倒角尺寸
- GB/T 19808-2005塑料管材和管件公稱外徑大于或等于90mm的聚乙烯電熔組件的拉伸剝離試驗(yàn)
- GB/T 12771-2019流體輸送用不銹鋼焊接鋼管
- 工程驗(yàn)收及移交管理方案
- 班組建設(shè)工作體系課件
- 圖片編輯概述課件
- 第章交通調(diào)查與數(shù)據(jù)分析課件
- 2023年岳陽職業(yè)技術(shù)學(xué)院單招職業(yè)技能考試筆試題庫及答案解析
- 北師大版八年級數(shù)學(xué)上冊《認(rèn)識無理數(shù)(第2課時(shí))》參考課件2
評論
0/150
提交評論