洛谷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的整數 同樣馬的位置座標是需要給出的。現在要求你計算...