#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岁计算机菜鸟) 第一次写博客,可能语言描述不是很到位,欢迎各位大佬批评与指正!!