卡片换位

你玩过华容道的游戏吗?
这是个类似的,但更简单的游戏。
看下面 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值