c/c++实现网格最短路径问题

#include<iostream>
#include<stdio.h>
using namespace std;



int MinPath(int a[100][100],int m,int n){
	int dist[m][n],path[m][n],i,j;
	dist[0][0]=a[0][0];path[0][0]=0;
	for(j=1;j<n;j++)
	{
		dist[0][j]=dist[0][j-1]+a[0][j];path[0][j]=1;
	}
	for(i=1;i<m;i++){
		dist[i][0]=dist[i-1][0]+a[i][0];path[i][0]=0;
	}
	for(i=1;i<m;i++)
	for(j=1;j<n;j++)
	if(dist[i-1][j]<dist[i][j-1])
	{
		dist[i][j]=dist[i-1][j]+a[i][j];path[i][j]=0;
	}
		else
	{
	
	dist[i][j]=dist[i][j-1]+a[i][j];path[i][j]=1;
	}
	for(i=m-1,j=n-1;i>0||j>0;)
	{
		cout<<a[i][j]<<"<--";
		if(path[i][j]==0) i--;
		else j--;
	}
	cout<<a[0][0];
	return dist[m-1][n-1]; 
} 

int main(void){
	int arr[100][100];
        int len;int b;
        printf("请输入网格矩阵阶数\n");
        scanf("%d",&len);
        for(int i=0;i<len;i++){
        	for(int j=0;j<len;j++){
			
        printf("前输入矩阵下标为[%d,%d]的值\n",i,j);
           scanf("%d",&b);
           arr[i][j]=b;
        
		}
    }
    printf("你所输入网格的矩阵为:\n");
    for(int k=0;k<len;k++){
    	for(int m=0 ;m<len;m++){
    		printf("%-5d",arr[k][m]);
           if(m==(len-1)) printf("\n");
		}
	}
	printf("最短路径为:\n ");
  int ans=  MinPath(arr,len,len);
    printf("\n路径最小长度是: %d",ans); 
}


 

运行截图

在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
曼哈顿路由算法(Manhattan Routing Algorithm)是一种常用的电路布线算法,主要用于解决电路板的布线问题。该算法基于曼哈顿距离,即在网格图中计算两点之间的距离。 下面是使用 C++ 实现曼哈顿路由算法的示例代码: ```c++ #include <bits/stdc++.h> using namespace std; const int N = 1005; const int INF = 0x3f3f3f3f; int n, m; // 网格图的行数和列数 int sx, sy, tx, ty; // 起点和终点的坐标 int dis[N][N]; // 记录每个点到起点的曼哈顿距离 int vis[N][N]; // 标记每个点是否访问过 int pre[N][N]; // 记录每个点的前驱节点 // 计算两点之间的曼哈顿距离 int manhattan_distance(int x1, int y1, int x2, int y2) { return abs(x1 - x2) + abs(y1 - y2); } // 检查点是否合 bool check(int x, int y) { return x >= 1 && x <= n && y >= 1 && y <= m; } // BFS 遍历网格图 void bfs() { queue<pair<int, int>> q; q.push({sx, sy}); vis[sx][sy] = 1; dis[sx][sy] = 0; while (!q.empty()) { auto [x, y] = q.front(); q.pop(); if (x == tx && y == ty) { break; } // 枚举当前点的四个方向 for (int dx = -1; dx <= 1; dx++) { for (int dy = -1; dy <= 1; dy++) { if (dx == 0 || dy == 0) { // 只考虑横向和纵向移动 int nx = x + dx; int ny = y + dy; if (check(nx, ny) && !vis[nx][ny]) { vis[nx][ny] = 1; dis[nx][ny] = dis[x][y] + manhattan_distance(nx, ny, tx, ty); pre[nx][ny] = x * m + y; q.push({nx, ny}); } } } } } } // 输出路径 void print_path() { int cur = tx * m + ty; vector<int> path; while (cur != sx * m + sy) { path.push_back(cur); cur = pre[cur / m][cur % m]; } path.push_back(sx * m + sy); reverse(path.begin(), path.end()); for (int i = 0; i < path.size(); i++) { printf("(%d,%d)", path[i] / m, path[i] % m); if (i != path.size() - 1) { printf("->"); } } printf("\n"); } int main() { scanf("%d%d%d%d%d", &n, &m, &sx, &sy, &tx, &ty); memset(dis, INF, sizeof(dis)); memset(vis, 0, sizeof(vis)); memset(pre, -1, sizeof(pre)); bfs(); printf("最短路径长度为:%d\n", dis[tx][ty]); printf("路径为:"); print_path(); return 0; } ``` 在上面的代码中,我们使用 BFS 遍历网格图,并记录每个点到起点的曼哈顿距离。在遍历过程中,我们只考虑横向和纵向移动,忽略对角线移动。最终,我们可以根据记录的前驱节点,输出从起点到终点的最短路径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pofenx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值