1. 程式人生 > >經典動態規劃之過河卒【洛谷 P1002】

經典動態規劃之過河卒【洛谷 P1002】

傳送門

因為小兵只能往右走和往下走

所以動態轉移方程為map[i][j]=map[i-1][j]+map[i][j-1]

感覺上。。是很經典的。

題目描述

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

棋盤用座標表示,AAA點(0,0)(0, 0)(0,0)、BBB點(n,m)(n, m)(n,m)(nnn, mmm為不超過202020的整數),同樣馬的位置座標是需要給出的。

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

輸入輸出格式

輸入格式:

一行四個資料,分別表示BBB點座標和馬的座標。

輸出格式:

一個數據,表示所有的路徑條數。

輸入輸出樣例

輸入樣例#1: 複製
6 6 3 3
輸出樣例#1: 複製
6

說明

結果可能很大!

AC原始碼:

 

#include<iostream>
#include<cstdio>
#include<cstring>
int mx[9]={0,1,1,-1,-1,2,2,-2
,-2},my[9]={0,2,-2,2,-2,1,-1,1,-1}; long long map[21][21]={0}; using namespace std; int main() { int m,n,x,y; scanf("%d%d%d%d",&m,&n,&x,&y); map[0][0]=1; for(register int i=0;i<=n;i++) for(register int j=0;j<=m;j++) { if(j) map[i][j]
+=map[i][j-1]; if(i) map[i][j]+=map[i-1][j]; for(register int f=0;f<9;f++) if(j==x+mx[f]&&i==y+my[f]) { map[i][j]=0; break; } } printf("%lld\n",map[n][m]); }