文章目录

1 题目

送外卖
时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小)
题目描述
冬天到了,小伙伴们都懒得出去吃饭了,纷纷打电话叫起了外卖。送外卖的小哥想找出一条最短的路径,小区门口进来,送完外卖又回到小区门口。
整个小区是一个由m*n个边长为1的正方形组成的矩形,各幢公寓楼分布于正方型的顶点上,小区门口位于左上角。每幢楼与相邻的八个方向的楼之间都有道路。
下图为m=2,n=3的小区地图,并且外卖小哥要经过的最短路径为6。

输入描述:
输入有多组数据。
每组数据包含两个整数m (2≤n≤2^128) 和n (2≤r≤2^128),分别代表行数和列数。

输出描述:
对应每一组数据,输出外卖小哥需要经过的最短路径。结果保留两位小数。

输入例子:
2 2
3 3

输出例子:
4.00
9.41

2 解析

2.1 题意

求从左上角除法遍历完整个图会到左上角的最短路径

2.2 思路

送外卖————遍历完图会到起点的最短路径_i++
送外卖————遍历完图会到起点的最短路径_i++_02
因为数据过大,需要用到高精度的乘法。

3 参考代码

#include 
#include
#include

using std::string;

int main(int argc, char const *argv[]){
char s[40],ss[40];
int a[40],b[40],c[80];

while(scanf("%s%s",s, ss)!= EOF){
memset(a,0,sizeof(a)); //清零数组
memset(b,0,sizeof(b));
memset(c,0,sizeof(c)); //清零

int len = strlen(s);
int lenn = strlen(ss);

for (int i = 0 ; i < len ; i++) a[len - i - 1] = s[i] - '0';//将字符串转化为数组
for (int i = 0 ; i < lenn ; i++) b[lenn - i - 1] = ss[i] - '0';


for (int i = 0 ; i < len ; i++)
for (int j = 0 ; j < lenn ; j++)
c[i + j] += a[i] * b[j]; //运算(这个就有一点复杂了)

int l = len + lenn - 1; //l是结果的最高位数

for (int i = 0 ; i < l ;i++)
{
c[i + 1] += c[i] / 10; //保证每一位的数都只有一位,并进位
c[i] %= 10;
}

if (c[l] > 0) l++; //保证最高位数是对的

while (c[l - 1] >= 10)
{
c[l] = c[l - 1] / 10;
c[l - 1] %= 10;
l++;
}

while (c[l - 1] == 0 && l > 1) l--; //while去零法

for (int i = l - 1; i >= 0 ; i--) //输出结果
{
printf("%d",c[i]);
}
if((s[len -1]-'0')%2==0||(ss[lenn -1]-'0')%2==0){
printf(".00\n");
}else{
printf(".41\n");
}
}

return 0;
}