最短路径 -- 必须通过特定点

题目描述:

上图为从点(0,0)出发到点 (6,5)的示意图,要求每步只能沿着向上、下、左、右任意一个方向走一格长度。假设根据实际情况要求,存在一个点(3,2)必须通过。给定输入终点(m,n)坐标和必须通过的点(p,q),其中其中m,n,p,q都为自然数,点(p,q)不是起点也不是终点。

求从点(0,0)出发且经过点(p,q)到点(m,n)的最短路径的条数,并输出在所有最短路径中所经过点的纵坐标和最小的那一条路径。

比如,在下图从点(0,0)到点(2,1)的所有路径中,点(1,0)必须通过,最短的路径有两条:

(0,0)->(1,0)->(2,0)->(2,1)和(0,0)->(1,0)->(1,1)->(2,1),其中所经过的点的纵坐标和最小的是(0,0)->(1,0)->(2,0)->(2,1)这条。

程序的输入有两行:

第一行为终点坐标;

第二行为必须通过的点的坐标

输出也有两行:

第一行为最短路径的条数;

第二行为在所有最短路径中,纵坐标的和最小的那一条路径。

比如:

输入:

2 1

1 0

输出:

2

(0,0)(1,0)(2,0)(2,1)

测试用例:

测试输入期待的输出时间限制内存限制额外进程
测试用例 1以文本方式显示
  1. 2 1↵
  2. 1 0↵
以文本方式显示
  1. 2↵
  2. (0,0)(1,0)(2,0)(2,1)↵
1秒64M0

代码实现: 

#include<stdio.h>

int main()
{
	int m,n,p,q;
	scanf("%d %d",&m,&n);
	scanf("%d %d",&p,&q);
	int num;
	int x1=p,y1=q,x2=m-p,y2=n-q;
	int num1=x1+y1,num2=x2+y2;
	num=num1*num2;
	printf("%d\n",num);
	int i,j;
	for(i=0;i<=p;i++)
	{
		printf("(%d,0)",i);
	}
	for(j=1;j<=q;j++)
	{
		printf("(%d,%d)",p,j);
	}
	for(i=p+1;i<=m;i++)
	{
		printf("(%d,%d)",i,q);
	}
	for(j=q+1;j<=n;j++)
	{
		printf("(%d,%d)",m,j);
	}
	printf("\n");
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值