题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1295
很有意思的一道SPFA题。。。。
枚举这条路径的出发点(sx,sy),用dist[i][j]表示从(sx,sy)到(i,j)路径上最少要删除的障碍物的个数,然后暴力就好了
妈的最后忘了去掉system("pause")结果贡献了2发RE,我SB了
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#include <cmath>
#define MAXN 35
#define INF 0x3f3f3f3f
using namespace std;
struct info //队列信息
{
int x,y;
};
int xx[]={1,-1,0,0},yy[]={0,0,1,-1};
int map[MAXN][MAXN],n,m,T;
bool inQueue[MAXN][MAXN];
int dist[MAXN][MAXN];
info q[100000]; //队列
int h=0,t=1; //队首队尾指针
bool inMap(int x,int y)
{
if(x<1||x>n||y<1||y>m) return false;
return true;
}
void SPFA(int Sx,int Sy) //从(Sx,Sy)出发走完整个地图
{
memset(inQueue,false ,sizeof(inQueue));
memset(dist,INF,sizeof(dist));
h=0,t=1;
q[h].x=Sx,q[h].y=Sy;
inQueue[Sx][Sy]=true;
dist[Sx][Sy]=0;
while(h<t)
{
int nowx=q[h].x;
int nowy=q[h++].y;
inQueue[nowx][nowy]=false;
for(int dir=0;dir<4;dir++)
{
int nextx=nowx+xx[dir],nexty=nowy+yy[dir];
if(!inMap(nextx,nexty)) continue;
if(dist[nowx][nowy]+map[nextx][nexty]<dist[nextx][nexty])
{
dist[nextx][nexty]=dist[nowx][nowy]+map[nextx][nexty];
if(!inQueue[nextx][nexty])
{
inQueue[nextx][nexty]=true;
q[t].x=nextx,q[t++].y=nexty;
}
}
}
}
}
double cal(int x1,int y1,int x2,int y2) //计算(x1,y1)到(x2,y2)的欧几里得距离
{
return sqrt((double)((x1-x2)*(x1-x2))+((y1-y2)*(y1-y2)));
}
int main()
{
double ans=0;
char s[MAXN];
scanf("%d%d%d",&n,&m,&T);
for(int i=1;i<=n;i++)
{
scanf("%s",s+1);
for(int j=1;j<=m;j++)
map[i][j]=s[j]-'0';
}
for(int sx=1;sx<=n;sx++) //当前这条路径起点坐标(sx,sy)
for(int sy=1;sy<=m;sy++)
{
SPFA(sx,sy);
for(int endx=1;endx<=n;endx++)
for(int endy=1;endy<=m;endy++) //枚举终点坐标(endx,endy)
if(dist[endx][endy]<=T-map[sx][sy])
ans=max(ans,cal(sx,sy,endx,endy));
}
printf("%.6lf\n",ans);
return 0;
}