1005: 过河卒
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 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;
}