马踏过河卒

  • 时间限制     1000ms
  • 空间限制     32768K

A 点有一个过河卒,需要走到目标 B 点。卒行走规则:可以向下、或者向右。同时在棋盘上的任一点有一个对方的马(如上图的 C 点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点。例如上图 C 点上的马可以控制 999 个点(图中的 P1、P2、... 、P8 和 C)。卒不能通过对方马的控制点。

棋盘用坐标表示,A 点(000000)、B 点(BxB_xBxByB_yBy)、CCC 点(CxC_xCxCyC_yCy)(0<Cx<Bx≤200 < C_x < B_x \leq 200<Cx<Bx200<Cy<By≤200 < C_y < B_y \leq 200<Cy<By20)。现在要求你计算出过河卒从 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]);
	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值