10076

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;
}

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *