每次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; }
时间: 2024-10-20 11:41:00