1. 程式人生 > >luogu P1002 過河卒

luogu P1002 過河卒

for clas tro ret iostream article 表示 格式 strong

題目描述

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

棋盤用坐標表示,A點(0, 0)、B點(n, m)(n, m為不超過20的整數),同樣馬的位置坐標是需要給出的。

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

輸入輸出格式

輸入格式:

一行四個數據,分別表示B點坐標和馬的坐標。

輸出格式:

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

輸入輸出樣例

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

說明

結果可能很大!

最基礎的dp

 1 #include<iostream>
 2 using namespace std;
 3 const int N=120;
 4 int t=10;
 5 long long dp[N][N],b[N][N],hor[N][N],n,m,x,y;
 6 int main()
 7 {
 8     cin>>n>>m>>x>>y;
 9     hor[x+t][y+t]=1
; 10 hor[x-2+t][y+1+t]=1; 11 hor[x+2+t][y+1+t]=1; 12 hor[x-1+t][y+2+t]=1; 13 hor[x+1+t][y+2+t]=1; 14 hor[x-2+t][y-1+t]=1; 15 hor[x+2+t][y-1+t]=1; 16 hor[x-1+t][y-2+t]=1; 17 hor[x+1+t][y-2+t]=1; 18 dp[t][t-1]=1; 19 for(int i=t;i<=n+t;i++) 20 {
21 for(int j=t;j<=m+t;j++) 22 { 23 if(hor[i][j]!=1) 24 dp[i][j]=dp[i-1][j]+dp[i][j-1]; 25 } 26 } 27 cout<<dp[t+n][t+m]; 28 return 0; 29 }

luogu P1002 過河卒