题目描述:
上图为从点(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秒 | 64M | 0 |
代码实现:
#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;
}