题目链接:https://www.nowcoder.com/acm/contest/118/A
本来想用记忆化搜索的,搞了半天弄不出来,干脆跑dijkstra搞搞吧。
#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=j;i<=k;i++)
typedef long long ll;
typedef pair<int,int> P;
struct edge{
int v;
int val;
};
int sx,sy,ex,ey;
int Map[205][205];
vector<edge> G[20005];
int d[20005];
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
int n;
void dijkstra(int st){
for(int i=0;i<=(n+1)*n;i++) d[i]=9999999;
d[st]=0;
priority_queue<P,vector<P>, greater<P> > q;
q.push(P(0,st));
while(!q.empty()){
P tmp=q.top();
q.pop();
if(tmp.first>d[tmp.second]) continue;
for(int i=0;i<G[tmp.second].size();i++){
if(d[G[tmp.second][i].v]>tmp.first+G[tmp.second][i].val){
d[G[tmp.second][i].v]=tmp.first+G[tmp.second][i].val;
q.push(P(d[G[tmp.second][i].v],G[tmp.second][i].v));
}
}
}
}
int main(){
while(cin>>n){
rep(i,1,n*n+n) G[i].clear();
rep(i,1,n) rep(j,1,n) {
scanf("%d",&Map[i][j]);
if(Map[i][j]==-1){
sx=i,sy=j;
Map[i][j]=0;
}
if(Map[i][j]==-2){
ex=i;
ey=j;
Map[i][j]=0;
}
}
rep(i,1,n) rep(j,1,n){
for(int k=0;k<4;k++){
int xx=i+dx[k];
int yy=j+dy[k];
if(xx<=0||yy<=0||xx>n||yy>n) continue;
G[i*n+j].push_back(edge{xx*n+yy,Map[xx][yy]});
}
}
dijkstra(sx*n+sy);
cout<<d[ex*n+ey]<<endl;
}
return 0;
}