蓝桥杯 青蛙跳杯子

问题描述
  X星球的流行宠物是青蛙,一般有两种颜色:白色和黑色。
  X星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去。
  如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个里边有一只青蛙。

在这里插入图片描述

其中,W字母表示白色青蛙,B表示黑色青蛙,*表示空杯子。

X星的青蛙很有些癖好,它们只做3个动作之一:
  1. 跳到相邻的空杯子里。
  2. 隔着1只其它的青蛙(随便什么颜色)跳到空杯子里。
  3. 隔着2只其它的青蛙(随便什么颜色)跳到空杯子里。

对于上图的局面,只要1步,就可跳成下图局面:

在这里插入图片描述

本题的任务就是已知初始局面,询问至少需要几步,才能跳成另一个目标局面。

输入为2行,2个串,表示初始局面和目标局面。
  输出要求为一个整数,表示至少需要多少步的青蛙跳。
在这里插入图片描述
数据规模和约定
  我们约定,输入的串的长度不超过15
  bfs,用结点node代表当前的状态,AC的C++程序如下:

#include<iostream>
#include<string>
#include<cstring>
#include<queue>
#include<map>
#include<algorithm>
using namespace std;
string str1,str2;
map<string ,int> visit;
struct node
{
	string s; //每个结点的状态 
	int step; //已经跳了多少步
	node(string s1,int st)
	{
		s=s1,step=st;
	 } 
	
};
queue<node> q;
int bfs( )
{
	int len=str1.size();
	q.push(node(str1,0));
	while(!q.empty())
	{
		node f=q.front();
		q.pop();
		if(f.s==str2) return f.step;
		for(int i=0;i<len;i++)
		{
			if(f.s[i]=='*')
			{
				for(int j=max(0,i-3);j<=min(len-1,i+3);j++) //在周围3个杯子搜索,但不能超过边界 
				{
					string fs=f.s;
					if(fs[j]!='*')
					{
					swap(fs[j],fs[i]);
					if(visit[fs]==0)
					{
						visit[fs]=1;
						q.push(node(fs,f.step+1));
					}
				}
				}
			}
		}
	}
}
int main()
{  
  cin>>str1>>str2;
  cout<<bfs()<<endl;  
}

猜你喜欢

转载自blog.csdn.net/jinduo16/article/details/86742245