输出从矩阵左上角到右下角的所有路径

一、问题描述

一个m×n的矩阵,只能从矩阵内部向右或向下走,输出从矩阵左上角到右下角的所有路径。

下图即为从1到6的所有路径

123
456

二、解题思路

1、数学解法求路径数

(1)使用排列组合。因为只能向右走或者向下走,在(m-1)+(n-1)次行走后,才能到达终点,也就是右下角。而在这m+n-2次行走中,有m-1次是向下,n-1次向右,所以是一个选择问题:


(2)水平行走记作0,竖直行走记作1。每一种行走足迹可以作为一个0,1串,其中n-1个0,m-1个1。可以看做0000000000000(n-1个0)1111111111111(m-1个1)的重排列,也就是:


2、队列输出所有路径

用队列实现打印所有路径。用结构体表示队列中每个点的状态(坐标值及其父结点,初始结点的父结点为-1),开始初始结点(根结点)进队列,然后循环执行以下操作直到队列为空:

1)结点Q出队列。

2)判断Q是否到达目标结点(叶节点),若到达,则依据每个结点的父结点,输出从叶结点到根结点的这条路径。

3)若Q的右结点和下结点未出边界,则记录其父结点的位置(即Q的位置),并进队列。

输出可以看做是一棵二叉树从根结点到叶结点的所有路径。


三、代码实现

#include <stdio.h>

typedef struct temp
{
	int x;
	int y;
	int parent;
}Queue;

void path(int m, int n)
{
	Queue q[1000];
	int front = 0, rear = 0, i;

	q[rear].x = 0;
	q[rear].y = 0;
	q[rear++].parent = -1;
	while (front != rear)
	{
		if (q[front].x == m-1 && q[front].y == n-1)
		{
			i = front;
			while (i != -1) 
			{
				printf("%3d <-", q[i].x*n + q[i].y+1);
				i = q[i].parent;
			}
			printf("\n");
		}

		if (q[front].y < n-1)
		{
			q[rear].x = q[front].x;
			q[rear].y = q[front].y+1;
			q[rear++].parent = front;
		}

		if (q[front].x < m-1)
		{
			q[rear].x = q[front].x+1;
			q[rear].y = q[front].y;
			q[rear++].parent = front;
		}

		front++;
	}
}

int main()
{
	path(3,4);
	return 0;
}

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你可以使用 Dijkstra 算法来解决这个问题。 首先,你需要定义一个函数来实现 Dijkstra 算法: ```python import heapq def dijkstra(graph, start): distances = {node: float('inf') for node in graph} distances[start] = 0 queue = [] heapq.heappush(queue, [distances[start], start]) while queue: current_distance, current_node = heapq.heappop(queue) if current_distance > distances[current_node]: continue for neighbor, weight in graph[current_node].items(): distance = current_distance + weight if distance < distances[neighbor]: distances[neighbor] = distance heapq.heappush(queue, [distance, neighbor]) return distances ``` 这个函数接收一个字典类型的图(graph)和一个起点(start)作为输入,使用堆(Heap)来实现 Dijkstra 算法,最终返回起点到图中各个节点的最短距离。 接下来,你可以编写主函数来解决这个问题: ```python matrix = [[1, 3, 1], [1, 5, 1], [4, 2, 1]] # 输入矩阵 m, n = len(matrix), len(matrix[0]) graph = {(i, j): {} for i in range(m) for j in range(n)} for i in range(m): for j in range(n): if i < m - 1: graph[(i, j)][(i+1, j)] = matrix[i+1][j] if j < n - 1: graph[(i, j)][(i, j+1)] = matrix[i][j+1] distances = dijkstra(graph, (0, 0)) print(distances[m-1, n-1]) # 输出左上角右下角的最短路径和 ``` 在这个主函数中,我们首先将输入矩阵转换为一个字典类型的图(graph),其中每个节点表示矩阵中的一个元素,每个节点的邻居表示矩阵中该元素的边和下面的元素。然后,我们调用 dijkstra 函数来计算从左上角到图中各个节点的最短距离,并输出右下角节点的距离作为最短路径和。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值