最低通行费 C++(PTA)

#include <iostream> 
using namespace std;
int maze[102][102];//迷宫矩阵
int main() 
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		cin>>maze[i][j];//输入值 
	}
	int x=1,y=1,money=maze[1][1];//商人的初始位置
	while(x<n&&y<n)//防止商人出界
	{
		if(maze[x+1][y]<=maze[x][y+1])	
		{
			money=maze[x+1][y]+money;
			x++;
		}
		else
		{
			money=maze[x][y+1]+money;
			y++;
		}
	} 
	if(x>=n)
	{
		for(;y<=n;)
		money=maze[x][++y]+money;
	}
	else
	{
		
		for(;x<=n;)
		money=maze[++x][y]+money;
	}
	cout<<money;
}

上面为代码。

题目:一个商人穿过一个N×N的正方形的网格,去参加一个非常重要的商务活动。他要从网格的左上角进,右下角出。每穿越中间1个小方格,都要花费1个单位时间。商人必须在(2N-1)个单位时间穿越出去。而在经过中间的每个小方格时,都需要缴纳一定的费用。

这个商人期望在规定时间内用最少费用穿越出去。请问至少需要多少费用?

注意:不能对角穿越各个小方格(即,只能向上下左右四个方向移动且不能离开网格)

输入格式:

第一行是一个整数,表示正方形的宽度N (1≤N<100);

后面N行,每行N个不大于100的整数,为网格上每个小方格的费用。

输出格式:

至少需要的费用。

输入样例:

5
1  4  6  8  10 
2  5  7  15 17 
6  8  9  18 20 
10 11 12 19 21 
20 23 25 29 33

输出样例:

109

样例中,最小值为109=1+2+5+7+9+12+19+21+33。

思路:

1.从总体来看,本题中商人要从左上角进入,右下角出。这意味着我们可以将商人的初始位置定为(1,1)。为了避免打代码时脑子混乱,我们可以直接从数组下标为【1】单元开始赋值,这样子打代码时就不用减一了。(前提是数组要设大一点,比如如果n最大为200,那就要把数组长设置为201或以上)

2.从细节上看,本题商人必须在(2N-1)个单位时间内穿越出去。(2N-1)是什么概念呢?就是商人围着矩阵最外层走半圈的耗时。这意味着时间是非常紧的----商人不能往回走(就是往上或者往左走)这点很重要!!!(朋友们可以自己画个图走一下来感觉)

3.整合以下,就是商人从(1,1)开始走,通过比较下面和右边格子数字的大小来进行移动(不用管左边和上面的格子,因为没有时间)如果走到了最下面,那就往右边走就行了,不用管其大小(还是那个道理,不用管左边和上面!!)直到走至(n,n)--也就是右下角的位置。走到最右边时同理,只用管下面就行了。

思路理清楚后代码就不难了,相信各位朋友一定也有自己的见解,欢迎评论留言!

ps:这是本人 (18岁计算机菜鸟) 第一次写博客,可能语言描述不是很到位,欢迎各位大佬批评与指正!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值