题目描述
冬天到了,小伙伴们都懒得出去吃饭了,纷纷打电话叫起了外卖。送外卖的小哥想找出一条最短的路径,小区门口进来,送完外卖又回到小区门口。 整个小区是一个由m*n个边长为1的正方形组成的矩形,各幢公寓楼分布于正方型的顶点上,小区门口位于左上角。每幢楼与相邻的八个方向的楼之间都有道路。 下图为m=2,n=3的小区地图,并且外卖小哥要经过的最短路径为6。
输入描述:
输入有多组数据。 每组数据包含两个整数m (2≤n≤2^128) 和n (2≤r≤2^128),分别代表行数和列数。
输出描述:
对应每一组数据,输出外卖小哥需要经过的最短路径。结果保留两位小数。
输入例子:
2 2 3 3
输出例子:
4.009.41
代码:
#include <iostream> #include <string> #include <vector> #include <stdlib.h> using namespace std; struct bigcheng{ vector<int> a; vector<int> b; string result_str; }; //字符串转换为数字并反转 void chartonum(string a,string b,bigcheng &tempcheng){ int size_a = a.size(); int size_b = b.size(); for (int i = size_a-1;i >= 0;i--){ tempcheng.a.push_back(a[i] - '0'); } for (int i = size_b-1;i >= 0;i--){ tempcheng.b.push_back(b[i] - '0'); } } //逐位相乘,处理进位消除多余的0 void multiply(bigcheng &tempcheng,vector<int> &result_num){ for(int i = 0;i < tempcheng.a.size();i++){ for(int j = 0;j < tempcheng.b.size();j++){ result_num[i+j] += (tempcheng.a[i]) * (tempcheng.b[j]);//结果存放在result_num[i+j]中 } } for (int i = result_num.size() - 1;i >= 0;i--){ if (result_num[i] != 0){ break; }else result_num.pop_back(); } int c = 0; for(int i = 0;i < result_num.size();i++){ //处理进位 result_num[i] += c; c = result_num[i] / 10; result_num[i] = result_num[i] % 10; } if(c != 0){ result_num.push_back(c); } } //将计算结果转换为字符串并反转 void numtochar(bigcheng &tempcheng,vector<int> &result_num){ int size = result_num.size(); for(int i = 0;i < result_num.size();i++){ tempcheng.result_str.push_back(static_cast<char>(result_num[size-1-i]+'0')); } } int main(){ string a,b; while(cin >> a >> b){ bigcheng tempcheng; chartonum(a,b,tempcheng); vector<int> resultnum(a.size()+b.size()); multiply(tempcheng,resultnum); numtochar(tempcheng,resultnum); if((tempcheng.result_str[tempcheng.result_str.size()-1]-'0') % 2 == 0){ cout << tempcheng.result_str << ".00" << endl; }else{ cout << tempcheng.result_str << ".41" << endl; } } }