1 条题解

  • 0
    @ 2025-5-7 12:01:57

    题目大意:在一个8*8的棋盘里有一个国王和一些骑士,我们需要把他们送到同一顶点上去,骑士和国王的行动方式如图所示。国王可以选择一名骑士作为坐骑,上马后相当和该骑士 一起行动(相当于一个骑士),同一位置可以同时有多个骑士和国王,问最少走的步数

    解题思路:floyd+枚举,把88棋盘变成0~63的数,Floyd求出任意两点之间的最短路径。88枚举即可。枚举终点,骑士上马点,国王上哪个骑士,最终负责度O(64^4)。

    
    #include <string.h>
    #include <algorithm>
    #include <iostream>
    #include <stdio.h>
    using namespace std;
    
    char s[105];
    int cx[8][2]= {{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1}};
    int dx[8][2]= {{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
    int a[65][65],b[65][65],rking[65],king;
    
    bool judge(int i,int j)
    {
    	if(i>=0&&i<8&&j>=0&&j<8)
    		return true;
    	return false;
    }
    
    void init()
    {
    	for(int i=0; i<64; i++)
    	{
    		for(int j=0; j<64; j++)
    		{
    			if(i==j)
    				a[i][j]=b[i][j]=0;
    			else
    				a[i][j]=b[i][j]=999;
    		}
    	}
    	for(int i=0; i<8; i++)
    	{
    		for(int j=0; j<8; j++)
    		{
    			for(int k=0; k<8; k++)
    			{
    				int x=i+cx[k][0];
    				int y=j+cx[k][1];
    				int xx=i+dx[k][0];
    				int yy=j+dx[k][1];
    				if(judge(x,y))
    				{
    					a[i+j*8][x+y*8]=1;
    				}
    				if(judge(xx,yy))
    				{
    					b[i+j*8][xx+yy*8]=1;
    				}
    			}
    		}
    	}
    	for(int k=0; k<64; k++)
    	{
    		for(int i=0; i<64; i++)
    		{
    			for(int j=0; j<64; j++)
    			{
    				a[i][j]=min(a[i][j],a[i][k]+a[k][j]);
    				b[i][j]=min(b[i][j],b[i][k]+b[k][j]);
    			}
    		}
    	}
    }
    int main()
    {
    	init();
    	while(~scanf("%s",s))
    	{
    		int n=strlen(s);
    		king=s[0]-'A'+(s[1]-'1')*8;
    		int cnt=0;
    		for(int i=2; i<n; i+=2)
    		{
    			int x=s[i+1]-'1';
    			int y=s[i]-'A';
    			rking[cnt++]=x*8+y;
    		}
    		int ans=9999999;
    		for(int i=0;i<64;i++)///终点
    		{
    			for(int j=0;j<64;j++)///国王上马点
    			{
    				for(int k=0;k<cnt;k++)///国王所上的骑士
    				{
    					int sum=0;
    					for(int l=0;l<cnt;l++)
    					{
    						if(l==k)continue;
    						sum+=a[rking[l]][i];
    					}
    					sum+=b[king][j]+a[rking[k]][j]+a[j][i];
    					ans=min(ans,sum);
    				}
    			}
    		}
    		printf("%d\n",ans);
    	}
    	return 0;
    }
    • 1

    信息

    ID
    179
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者