(八省)蓝桥真题 跳蚱蜢

如图 p1.png 所示:

(八省)蓝桥真题 跳蚱蜢_第1张图片

 
有9只盘子,排成1个圆圈。
其中8只盘子内装着8只蚱蜢,有一个是空盘。
我们把这些蚱蜢顺时针编号为 1~8

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

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

注意:要求提交的是一个整数,请不要填写任何多余内容或说明文字。

20

方向:广度优先遍历。

 深度优先遍历更适合目标比较明确,以找到目标为主要目的的情况。

广度优先遍历更适合在不断扩大范围时找到最优解的情况。如下图1239的bfs情况,一层一层的向下搜索,当搜索到已访问过的数据时的步数一定大于(上下层关系)或等于(在同一层)初次访问该数据时的步数,所以是对于步数来说是最短访问路径。

(八省)蓝桥真题 跳蚱蜢_第2张图片

 环的实现:通过取余操作实现数组滚动模拟环。

swap(plate[now],plate[(now + dir[i]+9)%9]); 当前空盘位置序号+方向(-2,-1,1,2)+9,然后对9取模(余)。最后一定要加9,因为:当前空盘位置为0时,(0 - 1)% 9 出现越界,造成序列中出现“0”(本应只有123456789九个数字)。

#include 
#include 
#include 
using namespace std;
#define MAX 1000000000
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int start = 123456789, end = 876543219; 
int dir[4] = {-2,-1,1,2}; 
int plate[9];            //盘子数组,9个盘子,假设空盘放置数字9 
bool visit[MAX];    //数字最大为987654321 
queue >q;  //pair(值,步数) 

int getVal()
{
	int value = 0;
	for(int i = 0; i < 9; i++)
	{
		value = value*10+plate[i];
	} 	
	return value;
}
int main(int argc, char** argv) {
	q.push(make_pair(start,0));
	memset(visit,0,sizeof(visit));
	visit[start] = 1; 
	while(!q.empty())
	{
		int value = q.front().first;
		int step = q.front().second;
		//cout<= 0; i--)
		{ 
			if(value%10 == 9)
				now = i;//now指向空盘位置,设置放了数字9 
			plate[i] = value%10;
			value/=10;
		}
		//从-2,-1,1,2四中情况进行广度遍历
		for(int i = 0; i < 4; i++)
		{
			swap(plate[now],plate[(now + dir[i]+9)%9]);
			int num = getVal();
			
			if(!visit[num])//判重 
			{
				visit[num] = 1;
				if(num == end)
				{
					cout<

 

你可能感兴趣的:(蓝桥杯,C++)