题目链接:“蓝桥杯”练习系统

题面:

  个人觉得这是一题比较难想的搜索,我当时想了好久也没有想明白,当时只有零零散散的一点东西,并不足以写完这题,可能刷的题目太少了

这题通过交换空白格和周围的格子来实现,结束条件是a,b位置互换的时候,当时我想的时候没想好怎么保存上步状态,我们可以通过设置方向数组的对应位置来实现,记录上一步的走法,使这一步和上一步不会冲突即可

这题数据有问题,会有一组没有空白格,但是默认0,0是空白格的数据

#include <bits/stdc++.h>
using namespace std;
#define endl "\n"
int ax, ay, bx, by;
int ans = 50;
int dir[4][2] = {{1, 0}, {0, 1}, {0, -1}, {-1, 0}};
string s[2];
void dfs(int a, int p, int x, int y){
    if(s[ax][ay] == 'B' && s[bx][by] == 'A'){
        ans = min(ans, a);
        return ;
    }
    if(a > ans){
        return ;
    }
    for(int i = 0; i < 4; i++){
        int dx = x + dir[i][0];
        int dy = y + dir[i][1];
        if(dx >= 0 && dx < 2 && dy >= 0 && dy < 3 && p + i != 3){
            swap(s[x][y], s[dx][dy]);
            dfs(a + 1, i, dx, dy);
            swap(s[x][y], s[dx][dy]);
        }
    }
}
int main(){
    while(getline(cin, s[0])){
        getline(cin, s[1]);
        int x = 0, y = 0;
        for(int i = 0; i < 2; i++){
            for(int j = 0; j < 3; j++){
                if(s[i][j] == 'A'){
                    ax = i;
                    ay = j;
                }
                if(s[i][j] == 'B'){
                    bx = i;
                    by = j;
                }
                if(s[i][j] == ' '){
                    x = i;
                    y = j;
                }
            }
        }
        ans = 50;
        dfs(0, -1, x, y);
        printf("%d\n", ans);
    }
    return 0;
}

更多推荐