zoukankan      html  css  js  c++  java
  • HDU 5433

    每次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
    ",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;
    }
    
  • 相关阅读:
    笔记0510
    笔记0514
    笔记0521
    GridView专题
    笔记0418
    笔记0516
    笔记0515
    笔记0507
    Python 安装与环境变量配置
    ffmpeg 下载安装和简单应用
  • 原文地址:https://www.cnblogs.com/jie-dcai/p/4803729.html
Copyright © 2011-2022 走看看