送外卖————遍历完图会到起点的最短路径

文章目录

  • 1 题目
  • 2 解析
    • 2.1 题意
    • 2.2 思路
  • 3 参考代码

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 思路

送外卖————遍历完图会到起点的最短路径_第1张图片
送外卖————遍历完图会到起点的最短路径_第2张图片
因为数据过大,需要用到高精度的乘法。

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;
}

你可能感兴趣的:(牛客,数学问题)