3 4 4 5 2134 2#23 2#22 2221 1 1 3 3 4 4 7 2134 2#23 2#22 2221 1 1 3 3 4 4 50 2#34 2#23 2#22 2#21 1 1 3 3
1.03 0.00No Answer
这题用宽搜做,用minx[x][y][d]表示走到(x,y)且剩余斗志为d的最少体力,bfs的过程中,只有满足边界条件并且下一步算出来的值要小于min[xx][yy][d]时才把这个点放入队列。
#include<iostream> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #include<vector> #include<map> #include<set> #include<queue> #include<stack> #include<string> #include<algorithm> using namespace std; #define ll long long #define inf 999999999 #define maxn 10050 char gra[55][55]; int vis[55][55]; int tab[10][2]={0,1,-1,0,0,-1,1,0}; int n,m,k,x3,x2,y3,y2; struct node{ double tili; int x,y,douzhi; }q[1111111]; double minx[55][55][55]; void bfs() { int i,j,front,rear,x,y,xx,yy,douzhi,dou; double tili,ti; front=rear=1; q[front].x=x3;q[front].y=y3;q[front].tili=0;q[front].douzhi=k; while(front<=rear){ x=q[front].x;y=q[front].y;tili=q[front].tili;douzhi=q[front].douzhi; front++; //printf("%d %d %.2f %d\n",x,y,tili,douzhi); if(x==x2 && y==y2){ continue; } for(i=0;i<4;i++){ xx=x+tab[i][0];yy=y+tab[i][1]; if(xx>=1 && xx<=n && yy>=1 && yy<=m && gra[xx][yy]!='#'){ ti=tili+fabs(gra[xx][yy]-gra[x][y])/(double)douzhi; dou=douzhi-1; if(dou==0 || ti>=minx[xx][yy][dou]){ continue; } minx[xx][yy][dou]=ti; rear++; q[rear].x=xx;q[rear].y=yy;q[rear].tili=ti;q[rear].douzhi=dou; } } } } int main() { int i,j,T,h; double ans; scanf("%d",&T); while(T--) { scanf("%d%d%d",&n,&m,&k); for(i=1;i<=n;i++){ scanf("%s",gra[i]+1); } scanf("%d%d%d%d",&x3,&y3,&x2,&y2); if(k==0){ printf("No Answer\n");continue; } if(x2==x3 && y2==y3){ printf("0.00\n");continue; } for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ for(h=1;h<=k;h++){ minx[i][j][h]=inf; } } } minx[x3][y3][k]=0; bfs(); ans=inf; for(i=1;i<=k;i++){ if(ans>minx[x2][y2][i]){ ans=minx[x2][y2][i]; } } if(ans==inf){ printf("No Answer\n"); } else printf("%.2f\n",ans); } return 0; }