马拦过河卒

题目描述:如图,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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值