Problem description error:
∆T = ⌈β2(h2 − h1)⌉ + γ, if h1 < h2 , here if we use γ as problem description,we get WA from online judge,so use δ here to get accepted.
#include <iostream> #include <queue> #include <cstdio> #include <cstring> #include <cmath> #define INF 100000000 using namespace std; int M,N; int gr[20][20]; int dirx[4]={1,0,0,-1}; int diry[4]={0,1,-1,0}; float alpha1,alpha2; int gema; float beta1,beta2; int delta; int Rs,Cs,Rt,Ct; int E; int Time[20][20][205]; bool visit[20][20][205]; int MX; struct State{ int x,y,_energy,_time; }; struct cmp{ bool operator()(State one,State two) { return one._time<two._time; } }; bool bfs() { priority_queue<State,vector<State>,cmp> q; MX = INF; int valu,tt; for(int i=0;i<20;i++) { for(int j=0;j<20;j++) { for(int k=0;k<205;k++) { Time[i][j][k]=0; visit[i][j][k]=false; } } } visit[Rs][Cs][0]=1; State stat; stat.x = Rs;stat.y = Cs,stat._energy = 0; stat._time = 0; q.push(stat); int r,c,en,tm; Time[Rs][Cs][0]=0; bool Found=0; while(!q.empty()) { State tstat = q.top(); q.pop(); r = tstat.x;//q.front();q.pop(); c = tstat.y;//q.front();q.pop(); en = tstat._energy;//q.front();q.pop(); tm = tstat._time; if(r==Rt && c==Ct) { if(tm<MX) { MX = tm;//Time[r][en]; Found = 1; } continue; } for(int i=0;i<4;i++) { if(r+dirx[i]>=1 && r+dirx[i]<=M && c+diry[i]>=1 && c+diry[i]<=N) { if(gr[r]>gr[r+dirx[i]]]) { valu = ceilf((gr[r]-gr[r+dirx[i]]])*alpha1)+gema; tt = ceilf((gr[r]-gr[r+dirx[i]]])*beta1)+delta; } else if(gr[r]<gr[r+dirx[i]]]) { valu = ceilf((gr[r+dirx[i]]]-gr[r])*alpha2)+gema; tt = ceilf((gr[r+dirx[i]]]-gr[r])*beta2)+delta;//gema } else if(gr[r]==gr[r+dirx[i]]]) { valu = gema; tt = delta; } if(en+valu>E) continue; if(visit[r+dirx[i]]][en+valu]) continue; visit[r+dirx[i]]][en+valu] = 1; Time[r+dirx[i]]][en+valu] = tm+tt;//Time[r][en]+tt; tstat.x = r+dirx[i]; tstat.y = c+diry[i]; tstat._energy = en+valu; tstat._time = tm+tt;//Time[r+dirx[i]]][en+valu]; q.push(tstat); } } } return Found; } int main() { while(cin>>M) { cin>>N; if(M+N==0) break; cin>>alpha1>>alpha2>>gema; cin>>beta1>>beta2>>delta; for(int i=1;i<=M;i++) { for(int j=1;j<=N;j++) cin>>gr[i][j]; } cin>>Rs>>Cs>>Rt>>Ct>>E; if(!bfs()) cout<<"failed\n";//failed else cout<<MX<<"\n"; } return 0; }