题目描述:如图,A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步(步长为根号5)可达的点称为方马的控制点。例如上图C点上的马可以控制9个点(图中的P1,P2...P8和C)。卒不能通过对方的控制点。棋盘用坐标表示,如A点(0,0)、B点(M, N),同样马的位置坐标是需要给出的(约定:C≠A且C≠B)。现在要求你计算出卒从A点能够到达B点的路径的条数。
B点的坐标(M,N)以及对方马的坐标(A,B) {不用判错}
输出
一个整数(路径的条数)。
样例输入
6 6 3 2
样例输出
17
源代码(C语言描述,数据输入输出均以文件形式给出,输入文件为input.in,输出文件为output.out)
#include <stdio.h>
#include <stdlib.h>
int M,N,A,B;
int Safe(int i,int j)//判断某点是否为安全点
{
if ( abs(A-i)*abs(B-j) == 2 || (A == i && B == j))
{
return 0;
}
else
{
return 1;
}
}
void main()
{
FILE * fp;
int D[13][13];//棋盘范围不超过13×13,如果有需要请自行修改
int i,j;
fp = fopen("input.in","r");
fscanf(fp,"%d",&M);//棋盘X坐标
fscanf(fp,"%d",&N);//棋盘Y坐标
fscanf(fp,"%d",&A);//马X坐标
fscanf(fp,"%d",&B);//马Y坐标
fclose(fp);
D[0][0] = 1;
for (i=1; i<=M; i++)
{
if (Safe(i,0))
{
D[i][0] = D[i-1][0];
}
else
{
D[i][0] = 0;
}
}
for (j=1; j<=N; j++)
{
if (Safe(0,j))
{
D[0][j] = D[0][j-1];
}
else
{
D[0][j] = 0;
}
}
for (i=1; i<=M; i++)
{
for (j=1; j<=N; j++)
{
if (Safe(i,j))
{
D[i][j] = D[i-1][j] + D[i][j-1];
}
else
{
D[i][j] = 0;
}
}
}
fp = fopen("output.out","w");
fprintf(fp,"%d", D[M][N]);
fclose(fp);
}
附件:测试数据。来源:信息学奥林匹克(中学高级本)。组织方式:输入文件knightX.in,对应输出文件knightX.out,共10组。
下载地址:http://pan.baidu.com/share/link?shareid=2609187764&uk=503766013