前言
暴力+最短路
debug半天
传送门 :
思路
样例就30我们可以枚举所有方案
同时我们只需要记录每一次最小挪动石头的方案就行
我们可以设置石头 为1 没有为0
然后跑最短路
CODE
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
#define px first
#define py second
typedef pair<int,int> pii;
int dxy[4][2] = {{-1,0},{0,1},{1,0},{0,-1}};
const int N = 40;
int n,m,t;
int mp[N][N],f[N][N];
int ans ;
struct node
{
int x, y;
};
int cal_distance(int x1,int y1 ,int x2 ,int y2)
{
return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
}
void cal(int x1,int y1)
{
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(f[i][j]<=t)
ans = max(ans,cal_distance(x1,y1,i,j));
}
}
}
void bfs(int x,int y)
{
memset(f,127,sizeof f);
f[x][y] = mp[x][y];
queue<node> q;
q.push({x,y});
while(!q.empty())
{
auto t = q.front();
q.pop();
cout<<t.x<<" "<<t.y<<endl;
for(int i= 0;i<=3;i++)
{
int fx = t.x +dxy[i][0];
int fy = t.y +dxy[i][1];
if(fx<=1) continue;
if(fx>=n) continue;
if(fy<=1) continue;
if(fy>=m) continue;
if(f[fx][fy] > f[t.x][t.y]+mp[fx][fy])
{
f[fx][fy] = f[t.x][t.y]+mp[fx][fy];
q.push({fx,fy});
}
}
}
}
void solve()
{
cin>>n>>m>>t;
for(int i=1;i<=n;i++)
{
for(int j= 1;j<=m;j++){
mp[i][j] = getchar()-'0';
}
getchar();
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
bfs(i,j);
cal(i,j);
}
}
// cout<<ans<<endl;
printf("%.6lf",sqrt(ans));
}
int main()
{
ios::sync_with_stdio(false);
solve();
return 0;
}