sicily 1321.Robot

47 篇文章 0 订阅

解题策略:典型的Djstra单源路径最短问题.问题的关键是将矩阵化为图的形式.

#include <iostream>
#include <vector>
#include <string>
#include <memory.h>
#include <cstring>
using namespace std;

struct edge
{
	int v;//点
	int cost;//权值
	edge(int a,int b)
	{
		this->v = a;
		this->cost = b;
	}
};

const int MAXN = 1000005;
const int N = 10005;
bool used[N];
int minlength[N];
vector<edge> map[N];
int matrix[105][105];
int num[105][105];
int col,row;//举证的行和列
int number;//转化的图中点的个数

int djstra(int start,int end)
{
	memset(used,false,sizeof(used));

	for(int i = 1;i <= number;i++)
		minlength[i] = (i == start ? 0 : MAXN);
	used[start] = true;
	for(int i = 1;i <= number;i++)
	{
		int temp_min = MAXN,a = start;
		for(int j = 1;j <= number;j++)
		{
			if(!used[j] && minlength[j] < temp_min)
			{
				temp_min = minlength[j];
				a = j;
			}
		}

		used[a] = true;
		for(int i = 0;i < map[a].size();i++)
		{
			int tempv = map[a][i].v;
			int cost = map[a][i].cost;
			if(!used[tempv] && minlength[tempv] > minlength[a] + cost)
				minlength[tempv] = minlength[a] + cost;
		}
	}

	return minlength[end];
}

int main()
{
    int n,m;
    cin >> n;
	while(n--)
	{
		int start_x,start_y,end_x,end_y;
		number = 0;
		cin >> col >> row;
		for(int i = 1;i <= col;i++)
			for(int j = 1;j <= row;j++)
			{
				cin >> matrix[i][j];
				num[i][j] = number++;
			}
			
		//将矩阵转化成图
		for(int x = 1;x <= col;x++)
			for(int y = 1;y <= row;y++)//对点(x,y)的上下左右探索,若点存在,则当做从点(x,y)到此点有一条边,且权值为此点的matrix值
			{
				if(num[x][y - 1])//上
				{
					map[num[x][y]].push_back(edge(num[x][y - 1],matrix[x][y - 1]));
				}
				if(num[x + 1][y])//右
				{
					map[num[x][y]].push_back(edge(num[x + 1][y],matrix[x + 1][y]));
				}
				if(num[x][y + 1])//下
				{
					map[num[x][y]].push_back(edge(num[x][y + 1],matrix[x][y + 1]));
				}
				if(num[x - 1][y])//左
				{
					map[num[x][y]].push_back(edge(num[x - 1][y],matrix[x - 1][y]));
				}
			
			}

		cin >> start_x >> start_y >> end_x >> end_y;

		cout << djstra(num[start_x][start_y],num[end_x][end_y]) + matrix[start_x][start_y] << endl;

		for(int i = 0; i < number + 2;i++)
		{
			map[i].clear();
		}
	}
    return 0;
}                                 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值