洛谷P1002 過河卒(動態規劃 遞推)

2021-10-03 18:30:36 字數 1664 閱讀 2772

洛谷p1002

題目描述

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

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

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

說明

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

分析

動態規劃(dynamic programming),卒子只能向左、向下走,採取自底向上的方法。

棋盤右下角座標(n,m),棋盤大小(n+1)(m+1)。

每個點可能有的路線數等於左邊點路線數加上邊點路線數。

由此可推出遞推式:

map(i,j) = map(i-1,j) + map(i,j-1)

為防止訪問越界,將棋盤整體右移一步,再下移一步,即初始化乙個(n+2,m+2)大小的棋盤

邊界和馬能到達的範圍不能走,初始化為0

馬能到達的範圍:左二上一,左二下一,左一上二,左一下二,右二上一,右二下一,右一上二,右一下二,包括馬自身的位置一共九個點,注意要檢查每個點是否都在棋盤範圍內。

#include #include using namespace std;

int main()

if (horsey + 1 <= m)

} if (0 <= hor*** - 1)

if (horsey + 2 <= m)

} if (hor*** + 1 <= n)

if (horsey + 2 <= m)

} if (hor*** + 2 <= n)

if (horsey + 1 <= m)

} m = m + 1, n = n + 1;

long long int map[22][22];

int i,j;

//初始化左邊界上邊界

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

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

//初始化棋盤

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

} //馬阻擋處

map[horsey + 1][hor*** + 1] = 0;

vector::iterator itx, ity;

for (itx = hor***f.begin(), ity = horseyf.begin(); itx != hor***f.end(); itx++, ity++)

//遞推結果

if (map[1, 1] == 0)

else

} for (i = 2; i < m + 1; i++)

}} }

//輸出結果

cout << map[m][n] << endl;

return 0;

}

洛谷P1002 過河卒(動態規劃)

棋盤上a點有乙個過河卒,需要走到目標b點。卒行走的規則 可以向下 或者向右。同時在棋盤上c點有乙個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為 馬攔過河卒 棋盤用座標表示,a點 0,0 b點 n,m n,m為不超過20的整數 同樣馬的位置座標是需要給出的。現在要求你計算...

洛谷P1002 過河卒 題解 動態規劃

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

洛谷 P1002 過河卒

棋盤上a點有乙個過河卒,需要走到目標b點。卒行走的規則 可以向下 或者向右。同時在棋盤上c點有乙個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為 馬攔過河卒 棋盤用座標表示,a點 0,0 b點 n,m n,m為不超過20的整數 同樣馬的位置座標是需要給出的。現在要求你計算...