ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【解题报告】走路的学问

2021-12-19 21:02:48  阅读:127  来源: 互联网

标签:int cin value ++ 解题 100 走路 学问 row


题目描述

如图:A到B的街区尺寸为4*5。A为左上,B为右下,从A走到B,只能向右或向下走,不绕路。输入A点和B点的坐标,如果街区之间的代价不一样,怎么求最短路径?
在这里插入图片描述

输入要求

第一行,输入一个整数n,1<n<100,表示街区的尺寸为n*n

第二行开始,输入n+n-1行数据,表示每段街区的代价

其中第1行代价为n-1个整数,表示该行从左向右走的横向代价值

第2行代价为n个整数,表示该行从上向下走的纵向代价值

以此类推

输出要求

从左上到右下的最短路径

输入样例

3
1 9
8 2 9
8 3
4 9 2
9 7

输出样例

8

来源

NBU OJ

#include "iostream"
#include "stdio.h"
using namespace std;
int main() {
  // freopen("in.txt", "r", stdin);
  int n;
  int row[100][100], column[100][100], value[100][100];

  cin >> n;
	//将一个点对应一对行列看作一组 则每个点读取一次向右和向下的权值
  for (int i = 0; i < n - 1; i++) {
    for (int j = 0; j < n - 1; j++) {
      cin >> row[i][j];
    }
    for (int j = 0; j < n; j++) {
      cin >> column[i][j];
    }
  }
  // 最后一行的行
  for (int j = 0; j < n - 1; j++) {
    cin >> row[n-1][j];
  }

  // 左上角value
  value[0][0] = 0;

  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      if (i == 0 && j == 0)//左上角直接跳
        continue;
      if (i == 0) { //第一行的点只有从左边来的唯一路径
        value[i][j] = value[i][j - 1] + row[i][j - 1];
        continue;
      }
      if (j == 0) { //第一列的点只有从上边来的唯一路径
        value[i][j] = value[i - 1][j] + column[i - 1][j];
        continue;
      }
      //非特殊点则判断哪条路来的权值最小 
      int k = value[i][j - 1] + row[i][j - 1];
      int kk = value[i - 1][j] + column[i - 1][j];
      value[i][j] = k < kk ? k : kk;
    }
  }
  cout << value[n - 1][n - 1] << endl;

  return 0;
}

标签:int,cin,value,++,解题,100,走路,学问,row
来源: https://blog.csdn.net/gongfpp/article/details/122029698

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有