# 跳蚱蜢
有 9 只盘子,排成 1 个圆圈。
其中 8 只盘子内装着 8 只蚱蜢,有一个是空盘,我们把这些蚱蜢顺时针编号为 1 ~ 8
每只蚱蜢都可以跳到相邻的空盘中,也可以再用点力,越过一个相邻的蚱蜢跳到空盘中。
请你计算一下,如果要使得蚱蜢们的队形改为按照逆时针排列,
并且保持空盘的位置不变(也就是 1-8 换位,2-7 换位,…),至少要经过多少次跳跃?
![](https://img-blog.csdnimg.cn/20200530104930106.png)
以下选项错误的是?
## aop
### before
```cpp
#include
using namespace std;
```
### after
```cpp
```
## 答案
```cpp
const int MAXN = 1e7;
int arr[9] = {4, 3, 2, 1, 0, 8, 7, 6, 5};
int tar[9] = {5, 6, 7, 8, 0, 1, 2, 3, 4};
int que[MAXN][9];
int dist[MAXN];
int pos[MAXN];
struct cmp
{
bool operator()(int a, int b)
{
return memcmp(que[a], que[b], sizeof(int) * 9) < 0;
}
};
set vis;
void set_init()
{
vis.clear();
}
bool inset_check(int a)
{
if (vis.find(a) == vis.end())
{
vis.insert(a);
return true;
}
return false;
}
int bfs()
{
int front = 1;
int rear = 2;
pos[front] = 4;
dist[front] = 0;
memcpy(que[front], arr, sizeof(int) * 9);
while (front < rear)
{
int *a = que[front];
if (memcmp(a, tar, sizeof(int) * 9) == 0)
return front;
for (int i = -2; i <= 2; i++)
{
if (i == 0)
continue;
int new_pos = (pos[front] + i + 9) % 9;
int *t = que[rear];
memcpy(t, a, sizeof(int) * 9);
dist[rear] = dist[front];
t[new_pos] = a[pos[front]];
t[pos[front]] = a[new_pos];
pos[rear] = new_pos;
if (inset_check(rear))
rear++;
}
front++;
}
return 0;
}
int main()
{
int ans = bfs();
printf("%d\n", dist[ans]);
return 0;
}
```
## 选项
### A
```cpp
string start = "012345678";
string e = "087654321";
int main()
{
queue> q;
q.push(make_pair(start, 0));
set s;
s.insert(start);
while (!q.empty())
{
string a = q.front().first;
int level = q.front().second;
if (a == e)
{
cout << level;
break;
}
q.pop();
int pos = 0;
while (a[pos] != '0')
pos++;
int posi[4];
posi[0] = (pos + 8) % 9;
posi[1] = (pos + 1) % 9;
posi[2] = (pos + 7) % 9;
posi[3] = (pos + 2) % 9;
for (int i = 0; i < 4; i++)
{
string b = a;
b[pos] = b[posi[i]];
b[posi[i]] = '0';
if (s.count(b) == 0)
{
s.insert(b);
q.push(make_pair(b, level + 1));
}
}
}
return 0;
}
```
### B
```cpp
struct node
{
string str;
int pos;
int step;
node(string str, int pos, int step) : str(str), pos(pos), step(step) {}
};
int N = 9;
set visited;
queue q;
void insertq(node no, int i)
{
string s = no.str;
swap(s[no.pos], s[(no.pos + i + 9) % 9]);
if (visited.count(s) == 0)
{
visited.insert(s);
node n(s, (no.pos + i + 9) % 9, no.step + 1);
q.push(n);
}
}
int main()
{
node first("012345678", 0, 0);
q.push(first);
while (!q.empty())
{
node temp = q.front();
if (temp.str == "087654321")
{
cout << temp.step;
break;
}
else
{
insertq(temp, 1);
insertq(temp, -1);
insertq(temp, 2);
insertq(temp, -2);
q.pop();
}
}
}
```
### C
```cpp
int dir[] = {1, -1, 2, -2};
unordered_map dist;
string S = "12345678X", T = "87654321X";
int bfs()
{
queue q;
q.push(S);
dist[S] = 0;
while (q.size())
{
string t = q.front();
q.pop();
if (t == T)
return dist[t];
int k = t.find('X'), distance = dist[t];
for (int i = 0; i < 4; i++)
{
swap(t[k], t[(k + dir[i] + 9) % 9]);
if (!dist.count(t))
{
q.push(t);
dist[t] = distance + 1;
}
swap(t[k], t[(k + dir[i] + 9) % 9]);
}
}
return -1;
}
int main()
{
cout << bfs() << endl;
return 0;
}
```