Vijos P1121 馬攔過河卒(動態規劃)

P1121馬攔過河卒

描述

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

棋盤用座標表示,A點(0, 0)、B點(n, m)(n, m爲不超過15的整數),同樣馬的位置座標是需要給出的。現在要求你計算出卒從A點能夠到達B點的路徑的條數,假設馬的位置是固定不動的,並不是卒走一步馬走一步。

格式

輸入格式

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

輸出格式

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

樣例1

樣例輸入1[複製]

6 6 3 3

樣例輸出1[複製]

6

限制

每個測試點1s

來源

zhouyc

思路

馬走日,以馬的座標爲中心,求出所有不能走的點,標註
設f[i][j]表示走到座標(i,j)時的方案數,則f[0][0]=1,要輸出f[n][m]

代碼

#include <iostream>
using namespace std;
int x[]={1,2,2,1,-1,-2,-2,-1};
int y[]={2,1,-1,-2,-2,-1,1,2};	//寫出近馬點的座標 
int n,m,hx,hy,f[101][101]={1},a[101][101];//f的初值爲1,也就是f[0][0]=1; 
int main()
{
	cin>>n>>m>>hx>>hy;
	a[hx][hy]=1;				//馬所在的位置不能走 
	for(int i=0;i<8;i++)
      a[hx+x[i]][hy+y[i]]=1;	//循環八個方向,將馬周圍不能走的點標註 
	for(int i=0;i<=n;i++)
	  for(int j=0;j<=m;j++)
	  {
	    if(i&&!a[i-1][j])		
	      f[i][j]+=f[i-1][j];
	    if(j&&!a[i][j-1])
	      f[i][j]+=f[i][j-1];
	  }
	cout<<f[n][m];   
	return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章