编辑代码

package luogu;
 
import java.util.*;
 
public class p1002 { 
	/*
	棋盘上 A 点有一个过河卒,需要走到目标 B 点。卒行走的规则:可以向下、或者向右。同时在棋盘上 C 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。
棋盘用坐标表示,A 点 (0, 0)(0,0)、B 点 (n, m)(n,m),同样马的位置坐标是需要给出的。
现在要求你计算出卒从 A 点能够到达 B 点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。
输入格式
一行四个正整数,分别表示 B 点坐标和马的坐标。
输出格式
一个整数,表示所有的路径条数。
	 */
	
	public static void main(String[] args) {
		
		Scanner cin = new Scanner (System.in);
		
		int bx = cin.nextInt();//B的X坐标
		
		int by = cin.nextInt();//B点Y坐标
		
		int my = cin.nextInt();//马的X坐标
		
		int mx = cin.nextInt();//马的Y坐标
		
		long m[][] = new long [bx+1][by+1];
		
		for(int i = 0;i < bx+1;i++) {
			
			for(int j = 0;j < by+1;j++) {
			
				if(i==my-1 && (j==mx-2 ||j==mx+2))m[i][j]=0;//这个点是马的控制范围内的点 所以表示为零 代表此路不通耶
				
				else if(i==my-2 && (j==mx-1 || j==mx+1))m[i][j]=0;//同上
				
				else if(i==my+1 && (j==mx-2 ||j==mx+2))m[i][j]=0;//同上
				
				else if(i==my+2 && (j==mx-1 || j==mx+1))m[i][j]=0;//同上
				
				else if(i==my &&j==mx)m[i][j]=0;//这是马本身的坐标 此路同样不通
				
				else m[i][j]=1;//其他的点暂时设为1 表示此路可通
			}
			
		}
		
		//原理如下
		/*6 6 3 3
		 * 
		 * 1 1 1 1 1 1 1
		 * 1 2 x 1 x 1 2
		 * 1 x 0 1 1 x 2
 		 * 1 1 1 0 1 1 3
		 * 1 x 1 1 1 x 3
		 * 1 1 x 1 x 0 3
		 * 1 2 2 2 3 3 6
		 * 
		 */
		
		for(int i =0; i<bx+1;i++) {
			
			for(  int j =0; j<by+1; j++) {
				
				if(m[i][j]==0)continue;//代表此路不通继续
				
				else if(i==0 &&j==0)continue;//这是初始点 不用考虑
				
				else if(i==0)m[i][j]=m[i][j-1];//x为零的一条线中我们只需要考虑每个点的左边,该点的前面连同几个点 这个点就会连同几个点
				
				else if(j==0)m[i][j]=m[i-1][j];//y为零的一条线中我们只需要考虑该点的上面的一点的情况即可,原理同上
				
				else m[i][j]=m[i-1][j]+m[i][j-1];//该点能连同的点数是该点左边和上面的点能连同的点的总数
			}
		}
		
 
		 
		 
		
		System.out.println(m[bx][by]);
		
 
	}
 
}