zoukankan      html  css  js  c++  java
  • poj1778

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

    输入格式:
    仅有一行,包含一个字母和数字间隔的字符串,先字母再数字,字母仅可能是大写的 A
    到 H,数字只可能是 1 到 8,描述国王和骑士的坐标位置,第一个是国王的坐标,后面都是
    骑士的坐标,显然字母是列号,数字是行号。
    输出格式:
    仅有一个数,表示题目要求的最少步数。
    样例输入: D4A3A8H1H8
    样例输出: 10
    数据范围:字符串的长度不会超过 128

    爆搜

    枚举64个相遇点

    再枚举64个国王JBSM的点

    #include<iostream>
    #include<cstring>
    #include<cmath>
    #define MN 64
    #define MV 100000
    #define min(a,b) a<=b?a:b
    #define max(a,b) a>=b?a:b
    using namespace std;
    int dir[8][2]={{-1,-2},{-2,-1},{-2,1},{-1,2},{1,-2},{2,-1},{2,1},{1,2}};
    int f[2][MN+1][MN+1],kn[MN+1][2],n=0,t[MN+1];
    bool lim(int x, int y)
    {
        return x>=0 && x<8 && y>=0 && y<8;
    }
    void csh()
    {
        int i,j,k,t1,t2,p1,p2;
        for (i=0;i<MN;i++) for (j=0;j<MN;j++)
        {
            if (i==j) f[0][i][j]=f[1][i][j]=0;
            else f[0][i][j]=f[1][i][j]=MV;
        }
        for (i=0;i<8;i++) for (j=0;j<8;j++) for (k=0;k<8;k++)
        {
            t1=i+dir[k][0];t2=j+dir[k][1];
            if (lim(t1,t2))
            {
                p1=i*8+j;p2=t1*8+t2;
                f[0][p1][p2]=f[1][p1][p2]=1;
            }
        }
    }
    void floyd()
    {
        int i,j,k;
        for (k=0;k<MN;k++) for (i=0;i<MN;i++) for (j=0;j<MN;j++)
        {
            f[0][i][j]=min(f[0][i][k]+f[0][k][j],f[0][i][j]);
            f[1][i][j]=min(f[1][i][k]+f[1][k][j],f[1][i][j]);
        }
    }
    int main()
    {
        int i,j,k,D,d1,d2,x,y,ans,king,s;
        char C[150];csh();floyd();
        while (scanf("%s",C)!=EOF)
        {
            n=(strlen(C)-2)/2;ans=MV;
            if (n==0) {cout<<0;continue;}
            king=(C[0]-'A')+(C[1]-'1')*8;
            for (i=0,j=2;i<n;i++,j+=2) t[i]=(C[j]-'A')+(C[j+1]-'1')*8;
            for (i=0;i<MN;i++)
            {
                s=0;
                for (k=0;k<n;k++) s+=f[0][t[k]][i];
                for (j=0;j<MN;j++)
                {
                    d1=f[1][king][j];d2=MV;
                    for (k=0;k<n;k++) d2=min(d2,f[0][t[k]][j]+f[0][j][i]-f[0][t[k]][i]);
                    ans=min(ans,s+d1+d2);
                }
            }
            cout<<ans<<endl;
        }
        //system("pause");
    }
    View Code
  • 相关阅读:
    ASP.NET中JSON的序列化和反序列化
    Android:数据存储之SQLite
    转Android:简单联网获取网页代码
    Android:@id和@+id
    linux .run文件安装
    Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
    网页页面尺寸
    openstack
    br0
    virsh
  • 原文地址:https://www.cnblogs.com/Kong-Ruo/p/7111631.html
Copyright © 2011-2022 走看看