小公尺 oj 馬走日 (bfs 或 雙向bfs)

2021-08-31 20:44:35 字數 1791 閱讀 8939

序號:#56難度:困難時間限制:1500ms記憶體限制:10m

描述在中國象棋中,馬只能走日字型。現在給出乙個由 n*m 個格仔組成的中國象棋棋盤( 有(n+1)*(m+1)個交叉點可以落子 ),以及棋盤上的兩個座標點 s,t。請計算出從 s 到 t 使用日字型走法所需的最少步數,如果不能到達,則輸出-1。

下圖為乙個1x2的棋盤,起始落子點(藍色)為(0, 0),目標落子點(綠色)為(1,2)的示意,此時需要的步數為1

輸入每行輸入6個數,由;分隔,第乙個數n,第二個數是m,接下來兩個數是 s 點的 x,y 座標,接著是 t 點的 x,y 座標。輸入保證滿足 (1<=n<=1000, 1<=m<=1000, 0<=x<=n, 0<=y<=m)

輸出所需的最少步數,不能到達則輸出-1

輸入樣例

1;1;0;0;1;1

1;2;0;0;1;2

2;2;0;0;2;0

複製樣例

輸出樣例

-1

12

一般bfs:

#includeusing namespace std;

typedef long long ll;

int n,m;

int sx,sy,des_x,des_y;

string buf;

int dx[8]=;

int dy[8]=;

bool vis[1005][1005];

int x[1005*1005];

int y[1005*1005];

int depth[1005][1005];

int que[1005*1005];

int ans;

int bfs()

for(int i=0;i<8;i++)}}

return -1;

}int main()

return 0;

}

雙向bfs:

#include#include#include#include#includeusing namespace std;

typedef long long ll;

int n,m;

int sx,sy,des_x,des_y;

string buf;

int dx[8]=;

int dy[8]=;

bool vis1[1005][1005];

int x_1[1005*1005];

int y_1[1005*1005];

int d1[1005][1005];

bool vis2[1005][1005];

int x_2[1005*1005];

int y_2[1005*1005];

int d2[1005][1005];

int ans;

int bfs()

if(f2<=t2&&vis2[now_x_1][now_y_1])

for(int i=0;i<8;i++)

}for(int i=0;i<8;i++)}}

return -1;

}int main()

return 0;

}

演算法 馬走日

題目描述 在西洋棋中,馬的走法與中國象棋類似,即俗話說的 馬走日 下圖所示即西洋棋中馬每一步能到達的格仔 箭頭所指為每步到達位置 現有一200 200大小的西洋棋棋盤,棋盤中僅有乙個馬,給定馬的當前位置和目標位置,求出馬最少需要多少跳才能從當前位置到達目標位置。輸入格式 已有檔案txt格式 檔案裡每...

馬的走法oj

time limit 1000 ms memory limit 65536 kib submit statistic problem description 在乙個4 5的棋盤上,馬的初始位置座標 縱 橫 位置由鍵盤輸入,求馬能返回初始位置的所有不同走法的總數 馬走過的位置不能重複,馬走 日 字 如...

百練 馬走日

總時間限制 記憶體限制 1000ms 1024kb 馬在中國象棋以日字形規則移動。請編寫一段程式,給定n m大小的棋盤,以及馬的初始位置 x,y 要求不能重複經過棋盤上的同乙個點,計算馬可以有多少途徑遍歷棋盤上的所有點。第一行為整數t t 10 表示測試資料組數。每一組測試資料報含一行,為四個整數,...