洛古 P1002 過河卒

題目描述:

棋盤上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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章