1. 程式人生 > >luogu1002 過河卒(NOIP2002普及組第4題)

luogu1002 過河卒(NOIP2002普及組第4題)

時空限制    1000ms/128MB

題目描述

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

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


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

輸入輸出格式

輸入格式:

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

輸出格式:

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

輸入輸出樣例

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

程式碼

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 25;
long long f[N][N];
bool g[N][N];
int dx[]={0,2,1,-1,-2,-2,-1, 1, 2},
	dy[]={0,1,2, 2, 1,-1,-2,-2,-1};

int main(){
	int n,m,x,y;
	cin>>n>>m>>x>>y;
	fill(g[0],g[0]+N*N,true);
	for (int i=0; i<=8; i++){
		int xx=x+dx[i],yy=y+dy[i];
		if (xx>=0 && xx<=n && yy>=0 && yy<=m) g[xx][yy]=false;
	}
	fill(f[0],f[0]+N*N,0);
	f[0][0]=1LL;
	for (int i=1; i<=n; i++)
		if (g[i][0]) f[i][0]=f[i-1][0];
	for (int i=1; i<=m; i++)
		if (g[0][i]) f[0][i]=f[0][i-1];
	for (int i=1; i<=n; i++)
		for (int j=1; j<=m; j++)
			if (g[i][j]) f[i][j]=f[i-1][j]+f[i][j-1];
	cout<<f[n][m]<<endl;
	return 0;
}