题目描述
今天LZY攻城小分队出动了,他们需要在尽可能短的时间内攻占敌人的大本营。战场是一个n * m的二维网格,LZY小分队初始在(0,0)点,敌军大本营在( n -1 ,m - 1)点
每个点上有一个对应的数字代表LZY小分队攻占这个据点需要耗费的时间,现在作为LZY小分队的指挥官,你需要指定一条合适的路线,使LZY小分队能用最短的时间攻占敌人大本营。
输入
测试样例由多组测试数据组成。每组测试数据第一行输入两个正整数n , m ( 1 <= n,m <= 100)
接下来输入n * m 个数字 ,每个数字不超过 500
输出
输出LZY小分队攻占敌人大本营所需要的最短时间
样例输入 Copy
3 3
1 2 3
1 2 3
1 2 3
样例输出 Copy
8
#include <cstdio>
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
int map[105][105];
int vis[105][105];
int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int n,m;
struct Node{
int x;
int y;
int value;
}S;
struct cmp{
bool operator()(Node a,Node b){
return a.value>b.value;
}
};
bool check(int x,int y){
if(x<0||y<0||x>=n||y>=m){
return false;
}
return true;
}
priority_queue<Node,vector<Node>,cmp> q;
int bfs(){
while(q.size()){
int x=q.top().x;
int y=q.top().y;
int value=q.top().value;
q.pop();
if(x==n-1&&y==m-1){
return value;
}
for(int i=0;i<4;i++){
int tx=x+dir[i][0];
int ty=y+dir[i][1];
if(check(tx,ty)&&vis[tx][ty]==0){
vis[tx][ty]=1;
S.x=tx;
S.y=ty;
S.value=map[tx][ty]+value;
q.push(S);
}
}
}
}
int main(){
while(scanf("%d %d",&n,&m)!=EOF){
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
scanf("%d",&map[i][j]);
}
}
memset(vis,0,sizeof(vis));
while(q.size()){
q.pop();
}
S.x=0;
S.y=0;
S.value=map[0][0];
q.push(S);
printf("%d\n",bfs());
}
return 0;
}