最新消息:点击查看大S的省钱秘笈

Vijos P1121 马拦过河卒 C语言版

OJ题解 Slyar 3890浏览 1评论

文章作者:姜南(Slyar) 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。

描述 Description

棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。
棋盘用坐标表示,A点(0, 0)、B点(n, m)(n, m为不超过15的整数),同样马的位置坐标是需要给出的。现在要求你计算出卒从A点能够到达B点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。

输入格式 Input Format

一行四个数据,分别表示B点坐标和马的坐标。

输出格式 Output Format

一个数据,表示所有的路径条数。

Tip:动态规划,说是递推也行,到达某点的路径数等于到达它的上、左两点的路径数之和

F[0,0]=1
F[i,j]=0            {m[x,y]=1}
F[i,0]=F[i-1,0]      {i>0,m[x,y]=0}
F[0,j]=F[0,j-1]      {j>0,m[x,y]=0}
F[i,j]=F[i-1,j] + F[i,j-1]      {i>0,j>0,m[x,y]=0}

#include <stdio.h>

int main(){
int i,j,bx,by,mx,my;
long m[21][21]={0},f[21][21]={0};
scanf("%d%d%d%d",&bx,&by,&mx,&my);
m[mx][my]=1;
m[mx+1][my+2]=1;
m[mx+2][my+1]=1;
m[mx+2][my-1]=1;
m[mx+1][my-2]=1;
m[mx-1][my-2]=1;
m[mx-2][my-1]=1;
m[mx-2][my+1]=1;
m[mx-1][my+2]=1;
f[0][0]=1;
for (i=1;i<=bx;i++) if(m[i][0]==0) f[i][0]=f[i-1][0];
for (j=1;j<=by;j++) if(m[0][j]==0) f[0][j]=f[0][j-1];
for(i=1;i<=bx;i++)
for(j=1;j<=by;j++){
if (m[i][j]) continue;
f[i][j]=f[i-1][j]+f[i][j-1];
}
printf("%ld",f[bx][by]);
system("pause");
return 0;
}

转载请注明:Slyar Home » Vijos P1121 马拦过河卒 C语言版

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (1)

  1. 汗...大一的啊..不错..
    9715年前(2009-01-21)回复