poj 1178 求所有棋子移动到相同位置的最小步数,

来源:互联网 发布:php工程师需要具备 编辑:程序博客网 时间:2024/05/20 07:50
#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++){        intsum=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);}

0 0
原创粉丝点击