樓上的程序太麻煩,效率低【騎士游歷問題】 設(shè)有一個m×n的棋盤(2≤m≤50,2≤n≤50),在棋盤上任一點有一個中國象棋“馬”,馬走的規(guī)則為:馬走日字;馬只能向右走。當(dāng)m,n給出后,同時給出馬起始的位置和終點的位置,試找出從起點到終點所有路徑的數(shù)目。輸入: m,n,x1,y1,x2,y2 (分別表示m,n、起點坐標(biāo)和終點坐標(biāo))輸出: 路徑數(shù)目(若不存在,則輸出0)【分析】 本題可以使用深度搜索發(fā)求解,但是效率很低,當(dāng)路徑很多時,不可能在短時間內(nèi)出解。可以采用動態(tài)規(guī)劃的設(shè)計思想。(專為樓下設(shè)計) 從(x1,y1)位置出發(fā),按照由左到右的順序定義階段的方向。位于(x2,y2)的左方且可達(dá)(x2,y2)的跳馬位置集合都是(x2,y2)的子問題,起點至(x2,y2)的路徑數(shù)實際上等于起點至這些位置集的路徑數(shù)之和。可以按照階段的順序依次計算每一個階段每個點的路徑數(shù)目。 階段i:中國象棋馬當(dāng)前的列位置(x1≤i≤x2) 狀態(tài)j:中國象棋馬在i列的行位置(1≤i≤m) 狀態(tài)轉(zhuǎn)移方程map[i,j]:起點(x1,y1)至(i,j)的路徑數(shù)目附標(biāo)程:const maxm=50; maxn=50;var m,n,x1,y1,x2,y2:integer; i,j,k,x,y:integer; map:array[-2..maxm+2,-2..maxn+2] of extended;beginfillchar(map,sizeof(map),0);readln(m,n,x1,y1,x2,y2);map[x1,y1]:=1;for i:=x1+1 to x2 do for j:=1 to m do map[i,j]:=map[i-1,j-2]+map[i-1,j+2]+map[i-2,j-1]+map[i-2,j+1];writeln(map[x2,y2]:0:0);end. 搜索比較慢,有代碼如下:program p7_1;const dx:array[1..8] of integer=(1,-1,-2,-2,-1,1,2,2); dy:array[1..8] of integer=(2,2,-1,-1,-2,-2,-1,1);var board:array[-1..7,-1..7] of integer; t,i,j,a,b:integer;procedure search(t,x,y:integer);var p,m,n:integer;begin if t=26 then begin for m:=1 to 5 do begin for n:=1 to 5 do write(board[m,n]:3); writeln; end; t:=-1; halt end; if board[x,y]=0 then begin board[x,y]:=t;inc(t); for p:=1 to 8 do search(t,x+dx[p],y+dy[p]); board[x,y]:=0; end;end;begin t:=1; for i:=-1 to 7 do for j:=-1 to 7 do board[i,j]:=-1; for a:=1 to 5 do for b:=1 to 5 do board[a,b]:=0; search(t,1,1); if t-1 then write('Wrong!');end.
創(chuàng)新互聯(lián)建站基于成都重慶香港及美國等地區(qū)分布式IDC機房數(shù)據(jù)中心構(gòu)建的電信大帶寬,聯(lián)通大帶寬,移動大帶寬,多線BGP大帶寬租用,是為眾多客戶提供專業(yè)遂寧托管服務(wù)器報價,主機托管價格性價比高,為金融證券行業(yè)服務(wù)器托管,ai人工智能服務(wù)器托管提供bgp線路100M獨享,G口帶寬及機柜租用的專業(yè)成都idc公司。
沒做過,看過。“騎士總是移向具有最少出口且沒有到達(dá)過的方格之一”是說,它可移動的位置有N個,在這N個中,尋找下一次可移動的位置最少的那個,做為騎士要去的點的位置。這是一種貪婪法,有的位置有解但你卻求不出來。
樓上的程序太麻煩,效率低
【騎士游歷問題】
設(shè)有一個m×n的棋盤(2≤m≤50,2≤n≤50),在棋盤上任一點有一個中國象棋“馬”,馬走的規(guī)則為:馬走日字;馬只能向右走。當(dāng)m,n給出后,同時給出馬起始的位置和終點的位置,試找出從起點到終點所有路徑的數(shù)目。
輸入:
m,n,x1,y1,x2,y2 (分別表示m,n、起點坐標(biāo)和終點坐標(biāo))
輸出:
路徑數(shù)目(若不存在,則輸出0)
【分析】
本題可以使用深度搜索發(fā)求解,但是效率很低,當(dāng)路徑很多時,不可能在短時間內(nèi)出解。可以采用動態(tài)規(guī)劃的設(shè)計思想。(專為樓下設(shè)計)
從(x1,y1)位置出發(fā),按照由左到右的順序定義階段的方向。位于(x2,y2)的左方且可達(dá)(x2,y2)的跳馬位置集合都是(x2,y2)的子問題,起點至(x2,y2)的路徑數(shù)實際上等于起點至這些位置集的路徑數(shù)之和。可以按照階段的順序依次計算每一個階段每個點的路徑數(shù)目。
階段i:中國象棋馬當(dāng)前的列位置(x1≤i≤x2)
狀態(tài)j:中國象棋馬在i列的行位置(1≤i≤m)
狀態(tài)轉(zhuǎn)移方程map[i,j]:起點(x1,y1)至(i,j)的路徑數(shù)目
附標(biāo)程:
const
maxm=50;
maxn=50;
var
m,n,x1,y1,x2,y2:integer;
i,j,k,x,y:integer;
map:array[-2..maxm+2,-2..maxn+2] of extended;
begin
fillchar(map,sizeof(map),0);
readln(m,n,x1,y1,x2,y2);
map[x1,y1]:=1;
for i:=x1+1 to x2 do
for j:=1 to m do
map[i,j]:=map[i-1,j-2]+map[i-1,j+2]+map[i-2,j-1]+map[i-2,j+1];
writeln(map[x2,y2]:0:0);
end.
搜索比較慢,有代碼如下:
program p7_1;
const dx:array[1..8] of integer=(1,-1,-2,-2,-1,1,2,2);
dy:array[1..8] of integer=(2,2,-1,-1,-2,-2,-1,1);
var board:array[-1..7,-1..7] of integer;
t,i,j,a,b:integer;
procedure search(t,x,y:integer);
var p,m,n:integer;
begin
if t=26 then begin
for m:=1 to 5 do begin
for n:=1 to 5 do write(board[m,n]:3);
writeln;
end;
t:=-1;
halt
end;
if board[x,y]=0 then begin
board[x,y]:=t;inc(t);
for p:=1 to 8 do search(t,x+dx[p],y+dy[p]);
board[x,y]:=0;
end;
end;
begin
t:=1;
for i:=-1 to 7 do
for j:=-1 to 7 do board[i,j]:=-1;
for a:=1 to 5 do
for b:=1 to 5 do board[a,b]:=0;
search(t,1,1);
if t-1 then write('Wrong!');
end.
新聞名稱:騎士巡游java代碼 騎士源碼
本文地址:http://vcdvsql.cn/article46/dopjjhg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號、定制網(wǎng)站、用戶體驗、網(wǎng)站策劃、網(wǎng)站設(shè)計、虛擬主機
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)