输出从矩阵左上角到右下角的所有路径
来源:互联网 发布:mysql5.7 修改端口号 编辑:程序博客网 时间:2024/05/21 11:11
一、问题描述
一个m×n的矩阵,只能从矩阵内部向右或向下走,输出从矩阵左上角到右下角的所有路径。
下图即为从1到6的所有路径
123456
二、解题思路
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;}
- 输出从矩阵左上角到右下角的所有路径
- 矩阵中从左上角到右下角的路径条数
- 从矩阵左上角到右下角的最大值
- 【DP】在矩阵中,选择一条从左上角到右下角、经过数字之和最大的路径
- Test1_N*N矩阵从左上角到右下角路径和的最大值
- 求矩阵左上角到右下角路径的最大价值
- 矩阵从左上角到右下角的最优路径使得经过路径上的权值和最大(最小)
- 矩阵中从左上角到右下角最短路径(五种方法)
- 求矩阵左上角到右下角所经过点的和的最大距离和路径
- 计算一个矩阵从左上角到右下角和最大
- 编程-从矩阵左上角走到右下角
- 经典面试题——从矩阵的左上角到右下角有多少种方法。
- 动态规划求解从矩阵左上角到右下角的最大受益问题
- python实现从二维矩阵左上角到右下角的出路数寻找
- 编程题:动态规划---从左上角到右下角的价值最大的路径
- [leetcode 64] Minimum Path Sum------从左上角到右下角的最小路径值
- 从左上角到右下角的带有阈值的最大值
- 二维数组--从左上角到右下角的最大值 九度
- “黑马程序员”学习笔记五
- QSqlTableMode设置单张表的查询过滤条件与表中有一列 id自动增加
- 获取最长字串
- “黑马程序员”学习笔记六
- poj3468 A Simple Problem with Integers(成段增减 区间求和)
- 输出从矩阵左上角到右下角的所有路径
- js关闭当前页面的几种方式
- 扫描DataTable的速度测试
- “黑马程序员”学习笔记七
- java反射机制
- 郁闷的时候就看看
- “黑马程序员”学习笔记八
- C++网络编程之TCP UDP
- Java Json/xml 序列化和反序列化工具:JsonTools 和 simpleframework【附带实例】