2018年北京資訊科技大學第十屆程式設計競賽暨ACM選拔賽 A-PUBG
阿新 • • 發佈:2019-01-07
題目連結: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; }