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 }

 

posted @ 2020-02-19 03:01  我只是一个码农  阅读(395)  评论(0编辑  收藏  举报