#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define MIN(x,y) ((x)>(y)?(y):(x))
#define MAX(x,y) ((x)>(y)?(x):(y))
using namespace std;
int d2[65][65],d1[65][65];
int kight[64];
int mov1[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
int mov2[8][2]={{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1}};
void init()
{
memset(d1,0x3f,sizeof(d1));
memset(d2,0x3f,sizeof(d2));
for(int i=0;i<64;i++)
d1[i][i]=d2[i][i]=0;
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
for(int k=0;k<8;k++)
{
int x1,x2,y1,y2;
x1=i+mov1[k][0];
y1=j+mov1[k][1];
if(x1>=0&&x1<8&&y1>=0&&y1<8)
{
d1[x1*8+y1][i*8+j]=1;
d1[i*8+j][x1*8+y1]=1;
}
x2=i+mov2[k][0];
y2=j+mov2[k][1];
if(x2>=0&&x2<8&&y2>=0&&y2<8)
{
d2[x2*8+y2][i*8+j]=1;
d2[i*8+j][x2*8+y2]=1;
}
}
for(int k=0;k<64;k++)
for(int i=0;i<64;i++)
for(int j=0;j<64;j++)
{
d1[i][j]=MIN(d1[i][j],d1[i][k]+d1[k][j]);
d2[i][j]=MIN(d2[i][j],d2[i][k]+d2[k][j]);
}
}
int main()
{
char str[200];
int king,tot,x,y;
init();
scanf("%s",str);
king=(str[0]-'A')*8+str[1]-'0'-1;
tot=0;
for(int i=2;i<strlen(str);i+=2)
kight[tot++]=(str[i]-'A')*8+(str[i+1]-'0'-1);
int res=0x3f3f3f3f;
for(int i=0;i<64;i++)
for(int j=0;j<64;j++)
for(int k=0;k<tot;k++)
{
int sum=d1[king][j];
sum+=d2[kight[k]][j];
sum+=d2[j][i];
for(int m=0;m<tot;m++)
sum+=d2[kight[m]][i];
sum-=d2[kight[k]][i];
if(sum<res)
res=sum;
}
printf("%d\n",res);
}
poj 1178 求所有棋子移动到相同位置的最小步数,
最新推荐文章于 2021-06-19 16:32:37 发布