FZU 2180 骑士 (双向BFS)

Description

在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位。在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵坐标相差为1的格子)移动到空位上。

给定一个初始的棋盘,怎样才能经过移动变成如下目标棋盘: 为了体现出骑士精神,他们必须以最少的步数完成任务。

Input

第一行有一个正整数T(T<=10) 表示一共有T组数据 接下来有T个5*5的矩形。0表示白色骑士1表示黑色骑士,*表示空位。(每组数据间有空行)

Output

对每组数据都输出一行。如果能在15不以内(包括15)到达目标状态,则输出步数,否则输出“Bored!”没有引号。

Sample Input

2
10110
01*11
10111
01001
00000

01011
110*1
01110
01010
00100

Sample Output

7
Bored!
分析:我写的是双向BFS,在bfs过程中如何查找一个矩阵有没有出现过喃?最容易想到的就是矩阵hash+map轻松解决,但是由于此题矩阵大小为5*5,最多25,我们可以换个方法,我们首先把整个矩阵编号,上到下左到右依次从0开始编号,记(i,j)位置编号为id[i][j]。我们另开一个变量state=0,如果图中(i,j)位置为“1”,那么state | = (1<
#include
#include
#include
#include
#include
#define inf 1e8
using namespace std;
char a[10][10]={"11111","01111","00*11","00001","00000"};
char b[10][10];
int state1,pos1,state2,pos2;
struct node
{
    int state;///图中“1”分布的状态
    int pos;///“*”的位置编号
    int dis;///步数
};
int id[10][10];///记录个点编号
const int f[8][2]={1,-2,1,2,2,1,2,-1,-1,2,-1,-2,-2,1,-2,-1};
int bfs()
{
    queue q1,q2;
    map,int> m1,m2;///map映射的是步数
    pair p1,p2;
    node now1,next1;
    node now2,next2;
    ///正向
    now1.state=state1;
    now1.pos=pos1;
    now1.dis=1;
    q1.push(now1);
    p1=make_pair(state1,pos1);
    m1[p1]=1;
    ///逆向
    now2.state=state2;
    now2.pos=pos2;
    now2.dis=1;
    q2.push(now2);
    p2=make_pair(state2,pos2);
    m2[p2]=1;

    if(state1==state2&&pos1==pos2) return 0;///一开始就是答案,输出0

    while(q1.size()&&q2.size())
    {
        ///正向
        now1=q1.front();
        q1.pop();
        if(now1.dis>=9) return -1;
        int x,y;///将pos还原成坐标
        x=now1.pos/5;
        y=now1.pos%5;
        for(int i=0;i<8;i++)
        {
            int mx=x+f[i][0];
            int my=y+f[i][1];
            if(mx<0||mx>=5||my<0||my>=5) continue;
            ///接下来将‘*’与(mx,my)处的值交换
            next1.pos=id[mx][my];
            next1.dis=now1.dis+1;
            next1.state=now1.state;///暂且存下来等待交换
            if(now1.state&(1<=8) return -1;
        x=now2.pos/5;
        y=now2.pos%5;
        for(int i=0;i<8;i++)
        {
            int mx=x+f[i][0];
            int my=y+f[i][1];
            if(mx<0||mx>=5||my<0||my>=5) continue;
            next2.pos=id[mx][my];
            next2.dis=now2.dis+1;
            next2.state=now2.state;
            if(now2.state&(1<15) puts("Bored!");
        else printf("%d\n",res);
    }
    return 0;
}



你可能感兴趣的:(搜索)