其他分享
首页 > 其他分享> > 【解题报告】走路的学问

【解题报告】走路的学问

作者:互联网

题目描述

如图: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