使用Java解洛谷P1002过河卒

棋盘上 A 点有一个过河卒,需要走到目标 B 点。卒行走的规则:可以向下、或者向右。同时在棋盘上 C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。

棋盘用坐标表示,A点 (0,0)、B 点 (n,m),同样马的位置坐标是需要给出的。

现在要求你计算出卒从 A 点能够到达 B 点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。

输入格式

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

输出格式

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

因为卒只能往下或者往右走,所以能通过某一点的总的路径数是该点的左边一点和上面一点的总的路径和

//原理如下
        /*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
         * 
         */

总代吗如下:

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) {
				// TODO Auto-generated method stub
		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


    此外我们还需要考虑马的控制范围,我们需要找到马的所有控制点,并且把这些点设置成无法通过的点(此路不通)

马能控制的点有九个点(加上马本身的位置)

判断该点是不是在马的控制范围内的代码如下:

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;//这是马本身的坐标 此路同样不通


  

你可能感兴趣的:(ACM,CSP,算法)