记录编号 |
29517 |
评测结果 |
AAAAAA |
题目名称 |
[NOIP 2002]过河卒 |
最终得分 |
100 |
用户昵称 |
Makazeu |
是否通过 |
通过 |
代码语言 |
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;
}