码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 5433

时间:2015-09-12 23:32:20      阅读:280      评论:0      收藏:0      [点我收藏+]

标签:

每次BC都好心酸。。。

BFS+queue。。状态可以设为p_val[x][y][k],加上斗志的值。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;

char str[55];
int h[55][55];
double p_val[55][55][55];
bool vis[55][55][55];

struct Point{
	int x,y,k;double p;
	Point(){}
	Point(int xx,int yy,int kk,double pp){
		x=xx,y=yy,p=pp;k=kk;
	}
	bool operator<(const Point &a)const{
		if(p>a.p)return true;
		else if(p==a.p){
			if(k<a.k) return true;
		}
		return false;
	}
};

int dir[4][2]={
	{0,1},
		{0,-1},
			{1,0},
				{-1,0}
};

int bx,by,ex,ey;
priority_queue<Point>que;

void slove(int n,int m,int k,Point bt){
	memset(vis,false,sizeof(vis));
	Point tmp;
	//priority_queue<Point>que;
	que.push(bt);
	bool flag=false;
	while(!que.empty()){
		bt=que.top();
		que.pop();
		if(vis[bt.x][bt.y][bt.k]) continue;
		vis[bt.x][bt.y][bt.k]=true;
		
	//	cout<<bt.p<<endl;
		if(bt.p>p_val[bt.x][bt.y][bt.k]&&bt.k<=1) continue;
		for(int i=0;i<4;i++){
			tmp.x=dir[i][0]+bt.x;
			tmp.y=dir[i][1]+bt.y;
			if(tmp.x>=1&&tmp.x<=n&&tmp.y>=1&&tmp.y<=m&&h[tmp.x][tmp.y]!=-1){
				tmp.p=bt.p+fabs(h[bt.x][bt.y]-h[tmp.x][tmp.y])/(bt.k*1.0);
				tmp.k=bt.k-1;
			//	cout<<tmp.p<<endl;
				if(tmp.p<p_val[tmp.x][tmp.y][tmp.k]&&abs(ex-tmp.x)+abs(ey-tmp.y)<tmp.k){
					p_val[tmp.x][tmp.y][tmp.k]=tmp.p;
					que.push(tmp);
				}
			}
		}
	}
	double ans=1e10;
	for(int i=1;i<=k;i++)
		ans=min(ans,p_val[ex][ey][i]);
	if(ans==1e10)
		puts("No Answer");
	else printf("%.2f\n",ans);
}

int main(){
	int T,n,m,k;
	scanf("%d",&T);
	while(T--){
		while(!que.empty())que.pop();
		scanf("%d%d%d",&n,&m,&k);
		for(int i=1;i<=n;i++){
			scanf("%s",str+1);
			for(int j=1;j<=m;j++){
				for(int s=0;s<=k;s++) p_val[i][j][s]=1e10;
				if(str[j]==‘#‘)
					h[i][j]=-1;
				else{
					h[i][j]=str[j]-‘0‘;
				}
			}
		}
		scanf("%d%d",&bx,&by);
		scanf("%d%d",&ex,&ey);
		if(abs(ex-bx)+abs(ey-by)>k||k==0){
			puts("No Answer");
			continue;
		}
		if(bx==ex&&by==ey){
			puts("0.00");
		}
		else{
			slove(n,m,k,Point(bx,by,k,0));
		}
		
	}
	return 0;
}

 

HDU 5433

标签:

原文地址:http://www.cnblogs.com/jie-dcai/p/4803729.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!