hiho一下 第九十九周 #1308 : 搜索二·骑士问题 【宽度优先搜索】

来源:互联网 发布:网游网络加速器 编辑:程序博客网 时间:2024/05/17 23:07

#1308 : 搜索二·骑士问题

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

小Hi:小Ho你会下国际象棋么?

小Ho:应该算会吧,我知道每个棋子的移动方式,马走日象飞田什么的...

小Hi:象飞田那是中国象棋啦!

小Ho:哦,对。国际象棋好像是走斜线来着。

小Hi:不过马走日倒是对了。国际象棋中的马一般叫做骑士,关于它有个很有意思的问题。

小Ho:什么啊?

小Hi:骑士巡游问题,简单来说就是关于在棋盘上放置若干个骑士,然后探究移动这些骑士是否能满足一定的而要求。举个例子啊:一个骑士从起始点开始,能否经过棋盘上所有的格子再回到起点。

小Ho:哦,看上去好像很难的样子。

小Hi:其实也还好了。简单一点的比如棋盘上有3个骑士,能否通过若干次移动走到一起。

小Ho:能够么?

小Hi:当然能够了。由于骑士特殊的移动方式,放置在任何一个初始位置的骑士,都可以通过若干次移动到达棋盘上任意一个位置。

小Ho:那么只要选定一个位置,把它们全部移动过去就好了是吧?

小Hi:是的,那么这里又有另一个问题了:要选择哪一个位置汇合,使得3个骑士行动的总次数最少?

小Ho:嗯,这个好像不是很难,让我想一想。

提示:骑士问题

输入

第1行:1个正整数t,表示数据组数,2≤t≤10。

第2..t+1行:用空格隔开的3个坐标, 每个坐标由2个字符AB组成,A为'A'~'H'的大写字母,B为'1'~'8'的数字,表示3个棋子的初始位置。

输出

第1..t行:每行1个数字,第i行表示第i组数据中3个棋子移动到同一格的最小行动步数。

样例输入
2A1 A1 A1B2 D3 F4
样例输出
02



代码:

#include<cstdio>#include<queue>#include<cstring>#include<algorithm>using namespace std;struct node{    int x,y,step;    bool friend operator <(node xx,node yy)    {        return xx.step>yy.step;    }}now,qian;int ma[10][10][3],dis[10][10];bool fafe[10][10];void dfs(int x,int y){    memset(fafe,false,sizeof(fafe));    priority_queue<node > que;    now.step=0;    now.x=x;    now.y=y;    fafe[x][y]=true;    que.push(now);    while (!que.empty())    {        now=que.top();        que.pop();        x=now.x;        y=now.y;        dis[x][y]=now.step;        if (x+1<=8)        {            if (y+2<=8)                if (!fafe[x+1][y+2])            {                fafe[x+1][y+2]=true;                qian.x=x+1;                qian.y=y+2;                qian.step=now.step+1;                que.push(qian);            }            if (y-2>0)                if (!fafe[x+1][y-2])            {                fafe[x+1][y-2]=true;                qian.x=x+1;                qian.y=y-2;                qian.step=now.step+1;                que.push(qian);            }            if (x+2<=8)            {                if (y+1<=8)                    if (!fafe[x+2][y+1])                {                    fafe[x+2][y+1]=true;                    qian.x=x+2;                    qian.y=y+1;                    qian.step=now.step+1;                    que.push(qian);                }                if (y-1>0)                    if (!fafe[x+2][y-1])                {                    fafe[x+2][y-1]=true;                    qian.x=x+2;                    qian.y=y-1;                    qian.step=now.step+1;                    que.push(qian);                }            }        }        if (x-1>0)        {            if (y+2<=8)                if (!fafe[x-1][y+2])            {                fafe[x-1][y+2]=true;                qian.x=x-1;                qian.y=y+2;                qian.step=now.step+1;                que.push(qian);            }            if (y-2>0)                if (!fafe[x-1][y-2])            {                fafe[x-1][y-2]=true;                qian.x=x-1;                qian.y=y-2;                qian.step=now.step+1;                que.push(qian);            }            if (x-2>0)            {                if (y+1<=8)                    if (!fafe[x-2][y+1])                {                    fafe[x-2][y+1]=true;                    qian.x=x-2;                    qian.y=y+1;                    qian.step=now.step+1;                    que.push(qian);                }                if (y-1>0)                    if (!fafe[x-2][y-1])                {                    fafe[x-2][y-1]=true;                    qian.x=x-2;                    qian.y=y-1;                    qian.step=now.step+1;                    que.push(qian);                }            }        }    }}void slove(int a,int b,int c,int d,int e,int f){   // printf("%d  %d  %d  %d  %d  %d\n",a,b,c,d,e,f);    dfs(a,b);    for (int i=1;i<9;i++)        for (int j=1;j<9;j++)            ma[i][j][0]=dis[i][j];    dfs(c,d);    for (int i=1;i<9;i++)        for (int j=1;j<9;j++)            ma[i][j][1]=dis[i][j];    dfs(e,f);    for (int i=1;i<9;i++)        for (int j=1;j<9;j++)            ma[i][j][2]=dis[i][j];    int ans=999;    for (int i=1;i<9;i++)        for (int j=1;j<9;j++)            ans=min(ans,ma[i][j][0]+ma[i][j][1]+ma[i][j][2]);    printf("%d\n",ans);}int main(){    int t;scanf("%d",&t);    char ch[5][5];    while (t--)    {        scanf("%s%s%s",ch[0],ch[1],ch[2]);        slove(ch[0][0]-'A'+1,ch[0][1]-'0',ch[1][0]-'A'+1,ch[1][1]-'0',ch[2][0]-'A'+1,ch[2][1]-'0');    }    return 0;}


0 0
原创粉丝点击