題目描述:
棋盤上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
說明/提示
結果可能很大!
心得:做這個題的時候以爲就是簡單的深搜,最後交的時候時間超限,數據太大了,最後發現是dp動態規劃,就是如果該點是馬能到的位置就不記錄,否則就依次去累加兩個方向到的位置。
程序代碼:
#include<algorithm>
#include<iostream>
using namespace std;
long long a[200][200],f[200][200];
int main()
{
int nect[8][2]={{1,2},{2,1},{2,-1},{1,-2},{-2,-1},{-1,-2},{-2,1},{-1,2}};
int i,j,t1,t2,t3,n,m,t4;
f[1][1]=1;
scanf("%d%d%d%d",&n,&m,&t3,&t4);
n++;m++;t3++;t4++;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
a[i][j]=0;
for(i=0;i<8;i++)
{
t1=t3+nect[i][0];
t2=t4+nect[i][1];
if(t1<0||t1>n||t2<0||t2>m)
continue;
a[t1][t2]=1;
}
a[t3][t4]=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i][j])
continue;
f[i][j]=max(f[i][j],f[i-1][j]+f[i][j-1]);
}
}
// printf("%lld\n",f[7][5]);
printf("%lld\n",f[n][m]);
return 0;
}