過河卒 bfs搜尋

2022-05-31 01:48:13 字數 2611 閱讀 6383

一共有三份**,

分別是只會寫迷宮時的、會寫dfs時的、動態規劃的,洛谷上對應的分數是40,60,100

這份**只是自己用來練習bfs的,執行的話只有40,資料過大會超時,還不是一般的超時,當m=n=20的時候,執行了一分鐘還沒結果。

用二維陣列表示棋盤,與題目的棋盤相比,加上了外圍的邊界,所以座標會有變化,比如:

原來座標:

改後坐標:

思路與迷宮完全相同

**如下:

#include #include 

#include

#define maxsize 30typedef

enum abc dir; //

只有兩個方向可走

typedef struct

pos;

typedef

struct

stack;

intmatrix[maxsize][maxsize];

intmain()

for (int j = 0; j <= m + 2; j++)

//把馬和可能走到的位置標記為不能走

for (int i = 1; i <= n + 1; i++)

for (int j = 1; j <= m + 1; j++)

if(

abs(i - (xhouse + 1)) == 1 && abs(j - (yhouse + 1)) == 2 ||abs(i - (xhouse + 1)) == 2 && abs(j - (yhouse + 1)) == 1 ||i == xhouse + 1 && j == yhouse + 1

) matrix[i][j] = 1

; stack path;

path.top = -1

; path.data[++path.top].x = 1

; path.data[path.top].y = 1

; path.data[path.top].dir =right;

while (path.top > -1

)

else

switch

(top_pos.dir)

else

path.data[path.top].dir++;

break

;

case

down:

if (matrix[top_pos.x][top_pos.y + 1] == 0

)

else

path.data[path.top].dir++;

break

;

default

: path.data[--path.top].dir++;}}

printf("%d

", path_num);

return0;

}

更新一下,還沒有學會動態規劃,倒是dfs用熟練了,開o2有60分了,看來dfs是一定超時了o(╥﹏╥)o

#include #include 

#define maxsize 25

intmatrix[maxsize][maxsize];

intxhorse, yhorse, xterminal, yterminal;

long

long

sum;

void dfs(int xstart,int

ystart)

if (matrix[xstart + 1][ystart] == 1

) dfs(xstart + 1

, ystart);

if (matrix[xstart][ystart + 1] == 1

) dfs(xstart, ystart + 1);}

intmain()

else

matrix[i][j] = 1

; dfs(

0, 0

); printf(

"%lld

", sum);

return0;

}

最終還是放棄了dfs,改用動態規劃了,100分過了,但還是對dfs不死心啊

#include #include 

#define maxsize 25

long

long

matrix[maxsize][maxsize];

intxhorse, yhorse, xterminal, yterminal;

intmain()

printf(

"%lld

", matrix[0][0

]);

return0;

}

過河卒 深度優先搜尋與遞推

題目描述 description 如圖,a 點有乙個過河卒,需要走到目標 b 點。卒行走規則 可以向下 或者向右。同時在棋盤上的任一點有乙個對方的馬 如上圖的c點 該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。例如上圖 c 點上的馬可以控制 9 個點 圖中的p1,p2 p8 和 c 卒不能通...

過河卒演算法

過河卒基本思想 利用動態規劃轉空間為時間,利用動態規劃一般方法,把資料記錄下來,同時走兩條路線,只要不重合就好 include include include include define maxx a,b,c,d max max a,b max c,d using namespace std in...

過河卒 遞推

description 如圖,a 點有乙個過河卒,需要走到目標 b 點。卒行走規則 可以向下 或者向右。同時在棋盤上的任一點有乙個對方的馬 如上圖的c點 該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。例如上圖 c 點上的馬可以控制 9 個點 圖中的p1,p2 p8 和 c 卒不能通過對方馬的...