zoukankan      html  css  js  c++  java
  • BFS(广度优先搜索遍历保存全局状态,华容道翻版做法)--08--DFS--蓝桥杯青蛙跳杯子

    题目描述

    X星球的流行宠物是青蛙,一般有两种颜色:白色和黑色。 
    X星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去。 
    如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个里边有一只青蛙。 
    *WWWBBB 
    其中,W字母表示白色青蛙,B表示黑色青蛙,*表示空杯子。 
    X星的青蛙很有些癖好,它们只做3个动作之一 
    1. 跳到相邻的空杯子里。 
    2. 隔着1只其它的青蛙(随便什么颜色)跳到空杯子里。 
    3. 隔着2只其它的青蛙(随便什么颜色)跳到空杯子里。 
    对于上图的局面,只要1步,就可跳成该局面:WWW*BBB 
    本题的任务就是已知初始局面,询问至少需要几步,才能跳成另一个目标局面。 

    输入

    输入存在多组测试数据,对于每组测试数据: 
    输入为2行,2个串,表示初始局面和目标局面。输入的串的长度不超过15 

    输出

    对于每组测试数据:输出要求为一个整数,表示至少需要多少步的青蛙跳。 

    样例输入 Copy

    *WWBB
    WWBB*
    WWW*BBB
    BBB*WWW

    样例输出 Copy

    2
    10
     1 #include<bits/stdc++.h>
     2 #define inf 0x3f3f3f3f
     3 typedef long long ll;
     4 using namespace std;
     5 string a,b;
     6 map<string,int>sigmap;
     7 class node{
     8 public:
     9     string s;
    10     int step;
    11     int id;
    12     node(string S,int step,int id){
    13         this->s=S;
    14         this->step = step;
    15         this->id=id;
    16     }
    17 };
    18 void bfs()
    19 {
    20     queue<node>myque;
    21     if(a==b)
    22         cout<<0<<endl;
    23     else{
    24         node Nod=node(a,0,a.find('*'));
    25         myque.push(Nod);
    26         sigmap[a]=1;
    27         while(!myque.empty()){
    28             Nod=myque.front();
    29             myque.pop();
    30             for(int i=Nod.id-3; i<=Nod.id+3; i++){
    31                 if(i>=0&&i<Nod.s.length()&&i!=Nod.id){
    32                     string S=Nod.s;
    33                     swap(S[i],S[Nod.id]);
    34                     if(sigmap[S] == 1)
    35                         continue;
    36                     if(S==b){
    37                         cout<<Nod.step+1<<endl;
    38                         return;
    39                     }
    40                     sigmap[S]=1;
    41                     node now=node(S,Nod.step+1,i);
    42                     myque.push(now);
    43                 }
    44             }
    45         }
    46     }
    47 }
    48 int main()
    49 {
    50     while(cin>>a){
    51         cin>>b;
    52         bfs();
    53     }
    54     return 0;
    55 }
  • 相关阅读:
    PHPCMS V9 导航栏当前栏目高亮
    phpcms v9栏目列表调用每一篇文章内容方法
    PHPCMS V9 为今天或几天前文章加new
    vue.js路由参数简单实例讲解------简单易懂
    vue组件知识总结
    vue.js 利用组件之间通讯,写一个弹出框例子
    vue.js组件之间通讯--父组件调用子组件的一些方法,子组件暴露一些方法,让父组件调用
    vue.js组件之间的通讯-----父亲向儿子传递数据,儿子接收父亲的数据
    vue.js通讯----父亲拿儿子的数据
    git常见操作---由简入深
  • 原文地址:https://www.cnblogs.com/qinqin-me/p/12259948.html
Copyright © 2011-2022 走看看