- 时间限制 1000ms
- 空间限制 32768K
A 点有一个过河卒,需要走到目标 B 点。卒行走规则:可以向下、或者向右。同时在棋盘上的任一点有一个对方的马(如上图的 C 点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点。例如上图 C 点上的马可以控制 999 个点(图中的 P1、P2、... 、P8 和 C)。卒不能通过对方马的控制点。
棋盘用坐标表示,A 点(000,000)、B 点(BxB_xBx,ByB_yBy)、CCC 点(CxC_xCx,CyC_yCy)(0<Cx<Bx≤200 < C_x < B_x \leq 200<Cx<Bx≤20,0<Cy<By≤200 < C_y < B_y \leq 200<Cy<By≤20)。现在要求你计算出过河卒从 A 点能够到达 B 点的路径的条数。注:象棋中马走“日”。
样例输入
5 5 2 4
样例输出
14
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int bx=sc.nextInt(),by=sc.nextInt();
int cx=sc.nextInt(),cy=sc.nextInt();
int x[]={-1, 1, 2, 2,-1,-1,-2,-2};
int y[]={ 2,-2, 1,-1, 2,-2, 1,-1};
int[][] d=new int[bx+1][by+1];
int[][] f=new int[bx+1][by+1];
for(int i=0;i<bx+1;i++)
{
for(int j=0;j<by+1;j++)
{
d[i][j]=0;
}
}
d[cx][cy]=1;
for(int i=0;i<8;i++)
{
int tx=cx+x[i];
int ty=cy+y[i];
if(tx>=0&&tx<=bx&&ty>=0&&ty<=by){
d[tx][ty]=1;
}
}
f[0][0]=1;
for(int i=0;i<=bx;i++)
{
for(int j=0;j<=by;j++)
{
if(i!=0&&d[i][j]!=1)
{
f[i][j]=f[i][j]+f[i-1][j];
}
if(j!=0&&d[i][j]!=1)
{
f[i][j]=f[i][j]+f[i][j-1];
}
}
}
System.out.println(f[bx][by]);
}
}