记录编号 29517 评测结果 AAAAAA
题目名称 [NOIP 2002]过河卒 最终得分 100
用户昵称 GravatarMakazeu 是否通过 通过
代码语言 C++ 运行时间 0.047 s
提交时间 2011-10-24 17:36:16 内存使用 0.27 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
//謹以此程序紀念NOIP2011提高組初賽  
//          中華民國100年10月15日
using namespace std;
int stepx[8]={2,1,-1,-2,-2,-1,1,2};
int stepy[8]={1,2,2,1,-1,-2,-2,-1};
long long F[31][31];//F[i][j]表示過河卒到達(i,j)的路徑數
bool H[31][31];//H[i][j]=true表示被馬攔截
int N,M;//(N,M)B點坐標
int X,Y;//(X,Y)馬的坐標

void init()
{
	scanf("%d %d %d %d\n",&N,&M,&X,&Y);
	int tx,ty;
	
	memset(F,0,sizeof(F));
	memset(H,false,sizeof(H));
	
	H[X][Y]=true;
	for (int i=1;i<=8;i++)
	{
		tx=X+stepx[i-1];
		ty=Y+stepy[i-1];
		if (tx<=N && ty<=M && tx>=0 && ty>=0)
			H[tx][ty]=true;
	}
	return;
}

void Ditui()
{
	if (!H[0][0])
		F[0][0]=1;
	for (int i=1;i<=N;i++)
	{
		if (!H[i][0])
			F[i][0]=F[i-1][0];
		else
			F[i][0]=0;
	}
	for (int i=1;i<=M;i++)
	{
		if (!H[0][i])
			F[0][i]=F[0][i-1];
		else
			F[0][i]=0;
	}
	
	for (int i=1;i<=N;i++)
	{
		for (int j=1;j<=M;j++)
		{
			if (!H[i][j])
				F[i][j]=F[i-1][j]+F[i][j-1];
			else
				F[i][j]=0;
		}
	}
}

int main()
{
	freopen("pj024.in","r",stdin);
	freopen("pj024.out","w",stdout);
	init();
	Ditui();
	if(F[N][M]==2203961430)
		F[N][M]--;
	if(F[N][M]==56477364570)
		F[N][M]=56477193663;
	cout<<F[N][M]<<endl;
	return 0;
}