1錯筆記 過河卒 動態規劃 BOOL記錄陣列

2021-10-10 02:17:33 字數 2340 閱讀 9610

棋盤上 aa 點有乙個過河卒,需要走到目標 bb 點。卒行走的規則:可以向下、或者向右。同時在棋盤上 cc 點有乙個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為「馬攔過河卒」。

棋盤用座標表示,aa 點 (0, 0)(0,0)、bb 點 (n, m)(n,m),同樣馬的位置座標是需要給出的

現在要求你計算出卒從 aa 點能夠到達 bb 點的路徑的條數,假設馬的位置是固定不動的,並不是卒走一步馬走一步。

一行四個正整數,分別表示 b 點座標和馬的座標。

乙個整數,表示所有的路徑條數。

輸入 #1

6 6 3 3
輸出 #1

6
對於 %100 的資料,1≤n,m≤20,0≤ 馬的座標 ≤20。

第乙個錯誤是錯在題意的理解上面,雖然這道題的背景是中國象棋,但是在看到卒過河後只能向下和向右時就有點懷疑,到底是為了防止陷入左右左右左的死迴圈,還是為了提醒我們這不是中國象棋的規則呢。

結果就是我想多了,對後面馬的行走方式「跳躍一步」我以為就是上下左右的一步而已,而不是日字走法,其實還忽略了圖的重要性,圖中已經標明了馬的控制點位置。

第二個困難就是這是我第一次用c++寫題,還有一些語法的問題。

這是我第一次寫的**

#include #include using namespace std;

int main()

for ( i=0; i<(x1+1); i++ )

for ( j=0; j<(y1+1); j++ )

for ( i=1; i<(x1+1); i++ )

for ( j=1; j<(y1+1); j++ )

cout << a[x1][y1];

return 0;

}

其實這個很容易就可以得出狀態轉移方程,即

a[i][j] = a[i-1][j] + a[i][j-1];

然後因為之前有陣列越界的經驗,所以就將第一行和第一列都初始化為1,從1,1開始算起(其實這裡就錯了,因為可能第一行和第一列中就有馬的控制點,又因為卒不能上走,故若在第一行控制點的右邊全為0),馬的行走方式也誤認為是上下左右一格,每寫完乙個的數值後動態重新整理馬控制點為0.

雖然整個思路也好,**也好都是錯的,但執行不了!!哪怕是簡單的資料也嚴重超時,看了好幾遍也不知道到底問題出現在**,估計是vector沒用好,但水平有限真的檢查不出來(哭)。

然後就還是換用普通的陣列了(以最大數值情況建立陣列),也改正了馬的行走方式,依舊採用每次寫入都動態重新整理控制點的做法,**如下:

#include #include using namespace std;

int fx=;

int fy=;

long long int a[21][21];

int i,j;

void reset(int x2, int y2);

int main()

cout《雖然這次解決了馬行走方式的問題,但還是沒有解決乙個問題,就是因為可能第一行和第一列中就有馬的控制點,又因為卒不能上走,故若在第一行控制點的右邊全為0。

那麼現在我的問題就是如何找到新的演算法解決第0行和列越界的情況,最終還是求助於洛谷的題解,看了別人的解法後都然大悟!!

既然我要解決越界問題,其實直接判斷這到底是不是第0行或列,然後揪出來特殊處理不就好了。題解的方法十分巧妙,將狀態轉移方程直接拆成兩個部分,分別對應行和列。

題解中還解決了乙個我很擔心的問題,縮短了時間複雜度,就是每次的reset,在我上面的解法中,我每次通過狀態轉移方程寫入資料時都要把馬的9個控制點重新歸零,要1個迴圈,九個步驟,特別擔心超時。但題解中直接利用bool陣列記錄,只用迴圈一次即可,同時為了防止越界,也限制了條件在前。

#include #include using namespace std;

//馬的9個控制點

int fx=;

int fy=;

//只有bp[0][0]被賦值為1,其餘均為0,這是全域性變數的特性

long long int bp[21][21]=;

//同樣利用的是全域性變數的特性

//但因為這個其實和最後的運算相反,需要再用到!

//當然,也可以這裡做處理,for迴圈賦初始值為1

bool mark[21][21];

int main()

for ( i=0; i<=x1; i++ )

for ( j=0; j<=y1; j++ )

cout

}

過河卒(動態規劃)

題目描述 棋盤上aa點有乙個過河卒,需要走到目標bb點。卒行走的規則 可以向下 或者向右。同時在棋盤上cc點有乙個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為 馬攔過河卒 棋盤用座標表示,aa點 0,0 0,0 bb點 n,m n,m nn,mm為不超過2020的整數 ...

過河卒 動態規劃 高精度

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

動態規劃 洛谷 過河卒

第 dp i j 個位置到達的可能性是第 dp i 1 j 個位置方案數 第 dp i j 1 個位置的方案數 題目中馬以 日 字形沿各方向跳出的點才是題目中所謂馬控制的九個點,而不是馬座標周圍的九個點 題目的座標系是以第四象限為平面,卒可向下或向右 dfs求路徑總數要設定邊界 1 到達目的地結束 ...