你玩过华容道的游戏吗?
这是个类似的,但更简单的游戏。
看下面 3 x 2 的格子
+—+—+—+
| A | * | * |
+—+—+—+
| B | | * |
+—+—+—+
在其中放5张牌,其中A代表关羽,B代表张飞,* 代表士兵。
还有一个格子是空着的。
你可以把一张牌移动到相邻的空格中去(对角不算相邻)。
游戏的目标是:关羽和张飞交换位置,其它的牌随便在哪里都可以。
输入格式:
输入两行6个字符表示当前的局面
输出格式:
一个整数,表示最少多少步,才能把AB换位(其它牌位置随意)
例如,输入:
* A
**B
程序应该输出:
17
再例如,输入:
A B
程序应该输出:
12
#include <iostream>
#include <cstring>
using namespace std;
char s[10];
char s1[10];
int A, B, cur;
int min1 = 30; //记录移动步数
void f(int cur, int i, int num);
void move(int x, int cur, int i, int num);
void move(int x, int cur, int i, int num) { //x为未来的空格位置 cur代表空格当前的位置 i代表空格上步的位置 num代表移动的步数
char t;
if (x != i) {
t = s[cur];
s[cur] = s[x];
s[x] = t;
f(x, cur, num+1);
t = s[cur];
s[cur] = s[x];
s[x] = t;
}
}
void f(int cur, int i, int num) {//cur代表空格当前的位置 i代表空格上步的位置 num代表移动的步数
if (num > min1)
return;
if (s[A] == 'B' && s[B] == 'A') {
min1 = num;
return;
}
if (cur == 0) {
move(1, cur, i, num);
move(3, cur, i, num);
}
if (cur == 1) {
move(0, cur, i, num);
move(2, cur, i, num);
move(4, cur, i, num);
}
if (cur == 2) {
move(1, cur, i, num);
move(5, cur, i, num);
}
if (cur == 3) {
move(0, cur, i, num);
move(4, cur, i, num);
}
if (cur == 4) {
move(1, cur, i, num);
move(3, cur, i, num);
move(5, cur, i, num);
}
if (cur == 5) {
move(2, cur, i, num);
move(4, cur, i, num);
}
}
int main() {
cin.getline(s, 4);
cin.getline(s1, 4);
strcat(s, s1);
for (int i = 0; i < strlen(s); i++) {
if (s[i] == 'A') {
A = i;
}
if (s[i] == 'B') {
B = i;
}
if (s[i] == ' ') {
cur = i;
}
}
f(cur, -1, 0);
cout << min1;
return 0;
}