中國象棋中的跳馬問題

2022-08-18 10:06:11 字數 1855 閱讀 6769

現在棋盤的大小不一定,由p,q給出,並且在棋盤中將出現障礙物(限制馬的行動,與象棋走法相同)

第一行輸入n表示有n組測試資料。

每組測試資料第一行輸入2個整數p,q,表示棋盤的大小(1<=p,q<=100)。

每組測試資料第二行輸入4個整數,表示馬的起點位置與終點位置。(位置的取值範圍同p,q)

第三行輸入m表示圖中有多少障礙。

接著跟著m行,表示障礙的座標。

馬從起點走到終點所需的最小步數。

如果馬走不到終點,則輸入「can not reach!」

2

9 10

1 1 2 3

09 10

1 1 2 3

81 2

2 23 3

3 41 4

3 22 4

1 3

1

can not reach!

此題是乙個搜尋題,可用dfs或bfs,建議選擇bfs(廣搜)。一開始把馬的起始點加入佇列,然後用廣搜的思想把此點能到達的其他點加入佇列,這裡需要乙個陣列用來記錄此點在之前是否已經加入佇列,如果加入過佇列當中,就不需要再加入了,直到佇列裡的元素為空,或者搜尋到了終點,搜尋即停止,然後輸出相應答案即可。

這道題並不難,就是hdu1372變一下,加了乙個蹩腳的條件。前兩天寫的時候wa了十幾回,想不通,感覺做法和標程差不多。今天拿來重新做,才發現了當時沒有發現的乙個重大問題。我在判斷是否蹩腳的時候是從終點(v.x,v.y)判斷的,但是應該是判斷起跳點(u.x,u.y)能否到終點!!!乙個小問題弄了半天!感覺下次出現這種問題需要冷靜一下,不能一直悶頭找,隔一段時間重新看會好一點。雖然用的stl的佇列會慢很多,但幸好沒有超時,就先這樣吧,等複習a*的時候看能不能加速。

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

7struct

pos8

;11 pos dir[8]=,,,,,,,};

12struct

node13;

16 queueque;

17int map[105][105

];18

int vis[105][105

];19

intp,q,sx,sy,ex,ey,ans;

2021

bool

in(int a,int

b)22

2627

bool can_move(int x,int y,int

d)28

33if(d==2||d==3)37

if(d==4||d==5)41

if(d==6||d==7)45

}4647int

bfs()

4872}73

}74}75

return -1;76

}7778int

main()

7999 ans=-1

;100 ans=bfs();

101if(ans>-1) printf("

%d\n

",ans);

102else printf("

can not reach!\n");

103}

104return0;

105 }

view code 1

正好大概了解了一下怎樣造資料:

#include#include

#include

intmain()

}return0;

}

view code 2

中國象棋中的跳馬問題 bfs

現在棋盤的大小不一定,由p,q給出,並且在棋盤中將出現障礙物 限制馬的行動,與象棋走法相同 第一行輸入n表示有n組測試資料。每組測試資料第一行輸入2個整數p,q,表示棋盤的大小 1 p,q 100 每組測試資料第二行輸入4個整數,表示馬的起點位置與終點位置。位置的取值範圍同p,q 第三行輸入m表示圖...

中國象棋中的跳馬問題(BFS)

題目描述 現在棋盤的大小不一定,由p,q給出,並且在棋盤中將出現障礙物 限制馬的行動,與象棋走法相同 輸入第一行輸入n表示有n組測試資料。每組測試資料第一行輸入2個整數p,q,表示棋盤的大小 1 p,q 100 每組測試資料第二行輸入4個整數,表示馬的起點位置與終點位置。位置的取值範圍同p,q 第三...

中國象棋的跳馬問題(BFS)

題目描述 現在棋盤的大小不一定,由p,q給出,並且在棋盤中將出現障礙物 限制馬的行動,與象棋走法相同 輸入 第一行輸入n表示有n組測試資料。每組測試資料第一行輸入2個整數p,q,表示棋盤的大小 1 p,q 100 每組測試資料第二行輸入4個整數,表示馬的起點位置與終點位置。位置的取值範圍同p,q 第...