1005: 过河卒

1005: 过河卒

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 50   Solved: 11
[ Submit][ Status][ Web Board]

Description

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

棋盘用坐标表示,A 点(0,0)、B 点(n,m)(n,m 为不超过 20 的整数,并由键盘输入),同样马的位置坐标是需要给出的(约定: C<>A,同时C<>B)。现在要求你计算出卒从 A 点能够到达 B 点的路径的条数。

Input

键盘输入
B点的坐标(n,m)以及对方马的坐标(X,Y){不用盘错}

Output

屏幕输出
一个整数(路径的条数)。

Sample Input

6 6 3 2

Sample Output

17





#include<iostream>
#include <cmath>
#include "cstdio"
#include <string.h>//string类



/*
 这一题的几个要点:
 1、这一题必须将数组改为long long,否则无法通过。因为最后的路线可能为很大,不考虑马理论极大值为20的20次方,非常大!!
 2、注意为键盘输入,必须用cin、cout来解答
 3、注意边界
 4、game[i][j]=game[i-1][j]+game[i][j-1];
 
 
 */
using namespace std;

int main()
{
    int Bx,By,Cx,Cy;
    //int game[25][25];
    long long game[25][25];
    //这一题必须用long long
    //这一题必须将数组改为long long,否则无法通过。因为最后的路线可能为很大,不考虑马理论极大值为20的20次方,非常大!!
    
    
    //freopen("/Users/qigelaodadehongxiaodi/Desktop/data1.txt", "r", stdin);
    //这个不理,是用来方便输入输出的东西,利用文本输入流来读取数据
    //提交代码的时候记得注销这条语句


  // scanf("%d%d%d%d",&Bx,&By,&Cx,&Cy);
    cin>>Bx>>By>>Cx>>Cy;//注意为键盘输入
    for(int i=0;i<=Bx;i++)
        for(int j=0;j<=By;j++)
            game[i][j]=1;
    
    
    //将马占据的位置设置为0,注意边界
    //好好检查,注意不要出错
    game[Cx][Cy]=0;
    game[Cx+2][Cy+1]=0;
    game[Cx+1][Cy+2]=0;
    //只要考虑减的情况不要越界,加的情况不用考虑
    if(Cx-2>=0&&Cy-1>=0)game[Cx-2][Cy-1]=0;
    if(Cx-2>=0)game[Cx-2][Cy+1]=0;
    if(Cy-1>=0)game[Cx+2][Cy-1]=0;
    if(Cx-1>=0&&Cy-2>=0)game[Cx-1][Cy-2]=0;
    if(Cx-1>=0)game[Cx-1][Cy+2]=0;
    if(Cy-2>=0)game[Cx+1][Cy-2]=0;

    
    
    for(int i=0;i<=Bx;i++){
        for(int j=0;j<=By;j++){
            if(game[i][j]){//有可能一开始马就把过河卒吃了
              if(i==0&&j==0)continue;
              else if(i==0)game[i][j]=game[i][j-1];
              else if(j==0)game[i][j]=game[i-1][j];
              else game[i][j]=game[i-1][j]+game[i][j-1];
            }
        }
    }
   
    //printf("%d",game[Bx][By]);
    cout<<game[Bx][By];
    return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值