【蓝桥杯】青蛙跳杯子(BFS)

一.题目描述

二.输入描述

输入为 2 行,2 个串,表示初始局面和目标局面。我们约定,输入的串的长度不超过 15。

三.输出描述 

输出要求为一个整数,表示至少需要多少步的青蛙跳。

四.问题分析

注意:空杯子只有一个

使用广度优先搜索

暴力枚举

//青蛙跳杯子
#include <bits/stdc++.h>

using namespace std;

string s1,s2;
int n;
int d[]={-3,-2,-1,1,2,3};
map <string,int> ans;

int bfs(){
    queue <string> q;
    q.push(s1);
    ans[s1]=0;
    
    while(!q.empty()){
        string s3=q.front();
        q.pop();
        
        int cnt=ans[s3];
        int x=(int)s3.find('*');
        
        for(int i=0;i<6;i++){
            int z=x+d[i];
            if(z>=0&&z<n){
                swap(s3[x],s3[z]);
                if(ans.count(s3)==0){
                    ans[s3]=cnt+1;
                    if(s3==s2){
                        return ans[s3];
                    }
                    q.push(s3);
                }
                swap(s3[x],s3[z]);
            }
        }
    }
    
    return -1;
}

int main(int argc, const char * argv[]) {
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    cin>>s1>>s2;
    n=(int)s1.size();
    cout<<bfs()<<'\n';
    return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值