跳蚱蜢

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/JiaweiLee2012/article/details/79040145
蓝桥杯2017 C/C++ A组第2题
题目:
有9只盘子,排成1个圆圈。
其中8只盘子内装着8只蚱蜢,有一个是空盘。
我们把这些蚱蜢顺时针编号为 1~8

每只蚱蜢都可以跳到相邻的空盘中,
也可以再用点力,越过一个相邻的蚱蜢跳到空盘中。

请你计算一下,如果要使得蚱蜢们的队形改为按照逆时针排列,
并且保持空盘的位置不变(也就是1-8换位,2-7换位,...),至少要经过多少次跳跃?

答案:20
(广度优先搜索)

#include <iostream>
#include <queue>
using namespace std;

int d[4]={-2,-1,1,2};

int state[9];
int zp;//空盘位置
int visited[876543211]={0};

queue<int> q;
queue<int> cnt;

void setState(int num){
    for(int i=8;i>=0;i--){
        if(num%10==0)
            zp=i;
        state[i]=num%10;
        num/=10;
    }
}

int getVal(){
    int num=0;
    for(int i=0;i<9;i++)
        num=num*10+state[i];
    return num;
}

bool extend(){
    int num=q.front();
    if(num==87654321){
        return false;
    }
    if(visited[num])
        return true;
    visited[num]=true;
    setState(num);
    for(int i=0;i<4;i++){
        state[zp]=state[(zp+d[i]+9)%9];
        state[(zp+d[i]+9)%9]=0;
        q.push(getVal());
        cnt.push(cnt.front()+1);
        setState(num);
    }
    return true;
}

int main(){
    setState(12345678);
    q.push(12345678);
    cnt.push(0);
    while(extend() && !cnt.empty()){
        q.pop();
        cnt.pop();
    }
    cout<<cnt.front()<<endl;
    return 0;
}

展开阅读全文

没有更多推荐了,返回首页