美文网首页
格子里的整数

格子里的整数

作者: loick | 来源:发表于2019-11-28 20:23 被阅读0次
Description

Given a square grid of size n, each cell of which contains integer cost which represents a cost to traverse through that cell, we need to find a path from top left cell to bottom right cell by which total cost incurred is minimum.

Note : It is assumed that negative cost cycles do not exist in input matrix.

Input

The first line of input will contain number of test cases T. Then T test cases follow . Each test case contains 2 lines. The first line of each test case contains an integer n denoting the size of the grid. Next line of each test contains a single line containing N*N space separated integers depecting cost of respective cell from (0,0) to (n,n).

Constraints:1<=T<=50,1<= n<= 50

Output

For each test case output a single integer depecting the minimum cost to reach the destination

Sample Input 1
2
5
31 100 65 12 18 10 13 47 157 6 100 113 174 11 33 88 124 41 20 140 99 32 111 41 20
2
42 93 7 14
Sample Output1
327
63

思路

这道题没有限制只能向下和向右走,所以也可以往回走,就不能用动态规划,递进的方式求解。

考虑用深度优先的方法,

首先初始化一个距离数组mindis,大小和格子相同,代表从左上角起点,到每个位置花费的最小值。

从左上角(0,0)开始,深度优先访问其相邻的点,

假设当前位置是(x,y),检查(x,y)4个方向的点(x+1, y), (x-1, y), (x, y+1), (x, y-1)

如果在格子内,且这个位置的距离misdis[i][j]大于mindis[x][y] + grid[x][y], 则更新misdis[i][j], 并继续深度遍历这个位置。

如图所示,cur表示到达(x, y)的花费,如果

  1. 检查(x+1, y), cur + grid[x+1][y]表示到达右边格子的花费,如果这个值小于mindis[x+1][y]的话,就更新mindis[x+1][y],并深度遍历(x+1, y) -> dfs(x+1, y, cur+grid[x+1][y])
  2. 检查(x-1, y)...
  3. 检查(x, y+1)...
  4. 检查(x, y-1)...

深度遍历的函数定义:

i表示横左边,j表示纵坐标,cur表示从左上角到达当前位置的花费。

function dfs(i, j, cur)

深度遍历结束后,我们就可以得到到达每个位置的最小花费了。

python
def solve(grid):
    m, n = len(grid), len(grid[0])
    mindis = [[float('inf')]*n for _ in range(m)]
    def dfs(i, j, cur):
        for x, y in [(i+1, j), (i-1, j), (i, j+1), (i, j-1)]:
            if 0 <= x < m and 0 <= y < n and mindis[x][y] > cur + grid[x][y]:
                mindis[x][y] = cur + grid[x][y]
                dfs(x, y, cur + grid[x][y])
    dfs(0, 0, grid[0][0])
    return mindis[-1][-1]

for _ in range(int(input())):
    n = int(input())
    nums = list(map(int, input().split()))
    grid = [nums[i:i+n] for i in range(0, len(nums), n)]
    print(solve(grid))

相关文章

  • 格子里的整数

    Description Given a square grid of size n, each cell of w...

  • 格子里

    昨天的我已经死去, 今天的我正在死去, 明天的我还活着。 老鼠立在人群中惴惴不安, 金鱼睁着眼睛,安静麻木又冷淡。...

  • 格子里的景色

    看着窗外的景色, 擦亮了眼睛也看不透的隔阂, 被钢铁阻挡的纵横与交错, 避也避不开的冷漠。 遥望着远方的橙色, 努...

  • 《格子里的大学》

    1.每次活动都需要被观众?? 当我们学生的时间不值钱是吗?? 说是被观众有综测,结果老子一个学期被观众六七次,为什...

  • 格子里的少女

    一说起格子衣服,我们第一反应应该是格子衬衫,很休闲舒服的感觉,但是今天我们所说的格子却是很女神少女风,模特身上连衣...

  • 格子里的东西

    最怕是提笔,笔下一斟酌,什么大道理都有了伏笔,什么也都成了格子里的东西。 关于画画。常常看那些画作,...

  • 格子里的故事

    创作于2009年11月10日 我不能轻抚 遮住你泪眼的秀发 穿过流水般的温存 却可以站在 暗淡的角落里羞赧的 吸着...

  • 格子里的月亮

    (网图,侵删) 月亮燃烧执着的情感 充满温柔的野...

  • 格子里的故事

    时间总是一格一格地过 每个格子里 都藏满了喜怒哀乐 幻想极度悲伤时可以直接到对岸去 当岸边的潮水将我推醒 枕头湿了...

  • 斑驳的格子里

    一处墙面斑驳的格子里。一颗悄然生长的小树。这些在平常人眼里平凡的不能再平凡。甚至不屑一顾的事物,在才子的笔下去应酬...

网友评论

      本文标题:格子里的整数

      本文链接:https://www.haomeiwen.com/subject/wrriwctx.html