蓝桥杯 卡片换位【第七届】【省赛】【C组】
·
题目链接:“蓝桥杯”练习系统
题面:

个人觉得这是一题比较难想的搜索,我当时想了好久也没有想明白,当时只有零零散散的一点东西,并不足以写完这题,可能刷的题目太少了
这题通过交换空白格和周围的格子来实现,结束条件是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;
}
更多推荐
所有评论(0)