#include<iostream>
#include<string>
#include<cmath>
using namespace std;
char a[51][51];
double x[11], y[11];
int m, n, minbs;
bool b[11] = {0};//宝箱是否拿到,拿到后置1
int mhd(int x0,int y0,int ge)//x0、y0冒险者位置、ge宝箱数量、sheng从第几个出发宝箱,(函数功能找到最近宝箱)
{
int min,minb=0;//最近宝箱序号minb
double sx[10] = {0};
for (int i = 1; i < ge; i++)
{
if (b[i]==1)
{
continue;
}
sx[i] = sqrt(pow(x[i]-x0, 2) + pow(y[i]-y0, 2));
}
min = sx[1];
for (int i = 1; i < ge; i++)
{
if (sx[i]>min&&b[i]==0)
{
min = sx[i];
minb = i;
}
}
return minb;
}
void dsf(int x0,int y0,int x1,int y1,int mins)//x0、y0冒险者位置,x1、y1宝箱位置'x1y1可换成x[mb]'(函数功能找最少步数路线)minbs最小步数
{
if (x0==x1 && y0==y1 && mins<minbs)
{
minbs = mins;
}
if (mins>10000)//走不到宝箱格
{
minbs=-1;
return;
}
if (x0>1&&a[x0-1][y0]!='*')
{
dsf(x0-1, y0, x1, y1, mins + 1);
}
if (x0<m && a[x0 + 1][y0] != '*')
{
dsf(x0+1, y0, x1, y1, mins + 1);
}
if (y0>1 && a[x0][y0-1] == '*')
{
dsf(x0, y0-1, x1, y1, mins + 1);
}
if (y0<n && a[x0][y0+1] == '*')
{
dsf(x0, y0 + 1, x1, y1, mins + 1);
}
return;
}
int main()
{
int t, z1 = 1, z2, s[6] = {0};
cin >> t;
for (int z = 0; z < t; z++)
{
cin >> m >> n;
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; j++)
{
cin >> a[i][j];
if (a[i][j]>='0'&&a[i][j]<='9')//存下宝箱位置
{
x[z1] = i;
y[z1] = j;
z1++;
}
if (a[i][j]=='*')//存下冒险者初始位置
{
x[0] = i;
y[0] = j;
}
}
}
int mb;
for (int i = 0; i <z1; i++)
{
minbs = 10000;
mb = mhd(x[0], y[0], z1);
cout << mb;
dsf(x[0],y[0],x[mb],y[mb],0);//找最少步数
if (minbs == -1)
{
s[z] = -1;
break;
}
s[z] = s[z] + minbs;
x[0] = x[mb];
y[0] = y[mb];
b[mb] = 1;//表示拿到宝箱
}
for (int i = 0; i <= 11; i++)//转换宝箱状态给下一组数据用
{
b[i] = 0;
}
}
for (int i = 0; i < t; i++)
{
cout << s[i];
}
return 0;
}
运行后bfs那里会出现错误,不知道怎么改