LQ0132 卡片换位【BFS】
admin
2024-03-31 11:01:48
0

题目来源:[蓝桥杯2016初赛 C++ C组H题

题目描述
你玩过华容道的游戏吗?这是个类似的,但更简单的游戏。看下面 3 x 2 的格子

    +---+---+---+| A | * | * | +---+---+---+| B |   | * |+---+---+---+

在其中放5张牌,其中A代表关羽,B代表张飞,* 代表士兵。还有一个格子是空着的。
你可以把一张牌移动到相邻的空格中去(对角不算相邻)。
游戏的目标是:关羽和张飞交换位置,其它的牌随便在哪里都可以。

输入格式
输入存在多组测试数据,对于每组测试数据:
输入两行6个字符表示当前的局面

输出格式
对于每组测试数据输出一个整数表示答案

输入样例

  • A
    **B
    A B

输出样例
17
12

问题分析
这是一个求最少移动的数量的题(题面没有讲清楚,BUG),用BFS来解决。
一种做法是,每个状态用字符串来存储,会稍微慢一些,好在规模小。
另外一种做法是,每个状态存储A、B和空格位置(坐标)来实现。

AC的C++语言程序如下:

/* LQ0132 卡片换位 */#include 
#include 
#include 
#include using namespace std;const int drow[] = {-1, 0, 1, 0};
const int dcol[] = {0, 1, 0, -1};const int R = 2, C = 3;
struct Node {int ar, ac, br, bc, sr, sc, step;
};char g[R][C + 1];
bool vis[R][C][R][C][R][C];int bfs(Node s)
{memset(vis, false, sizeof vis);vis[s.ar][s.ac][s.br][s.bc][s.sr][s.sc] = true;queue q;s.step = 0;q.push(s);while (!q.empty()) {Node t = q.front();q.pop();for (int i = 0; i < 4; i++) {int nr = t.sr + drow[i];int nc = t.sc + dcol[i];if (0 <= nr && nr < R && 0 <= nc && nc < C) {Node ns = t;ns.sr = nr;ns.sc = nc;ns.step++;if (nr == t.ar && nc == t.ac)ns.ar = t.sr, ns.ac = t.sc;if (nr == t.br && nc == t.bc)ns.br = t.sr, ns.bc = t.sc;if (ns.ar == s.br && ns.ac == s.bc && ns.br==s.ar && ns.bc==s.ac)return ns.step;if (vis[ns.ar][ns.ac][ns.br][ns.bc][ns.sr][ns.sc] == false) {vis[ns.ar][ns.ac][ns.br][ns.bc][ns.sr][ns.sc] = true;q.push(ns);}}}}return -1;
}int main()
{while (gets(g[0])) {gets(g[1]);Node s;for (int i = 0; i < R; i++)for (int j = 0; j < C; j++)if (g[i][j] == 'A')s.ar = i, s.ac = j;else if (g[i][j] == 'B')s.br = i, s.bc = j;else if (g[i][j] == ' ')s.sr = i, s.sc = j;cout << bfs(s) << endl;}return 0;
}

AC的C++语言程序如下:

/* LQ0132 卡片换位 */#include 
#include 
#include using namespace std;const int R = 2, C = 3;
string s, s1, s2;
int cnxa, cnxb;int drow[] = {-1, 0, 1, 0};
int dcol[] = {0, 1, 0, -1};int bfs()
{unordered_map m;queue q;q.push(s);m[s] = 0;while (!q.empty()) {string t = q.front();q.pop();if (t.find('A') == cnxb && t.find('B') == cnxa)return m[t];int k = t.find(' ');int r = k / C, c = k % C, d = m[t];for (int i = 0; i < 4; i++) {int nr = r + drow[i];int nc = c + dcol[i];if (0 <= nr && nr < R && 0 <= nc && nc < C) {swap(t[k], t[nr * C + nc]);if (m.count(t) == 0) {q.push(t);m[t] = d + 1;}swap(t[k], t[nr * C + nc]);}}}return -1;
}int main()
{while (getline(cin, s1) && getline(cin, s2)) {s = s1 + s2;cnxa = s.find('A');cnxb = s.find('B');cout << bfs() << endl;}return 0;
}

相关内容

热门资讯

感恩父母的读后感 感恩父母的读后感    感恩,这个词常常挂在我们嘴边,但是,行动的人却很少。     我读过一本书,...
缙云丨何泓璘:青山不碍白云飞 ... 青山不碍白云飞 文/何泓璘 我永远记得当时看到的一切: 以沉迷、往返、留恋为底色,地域的青山终不碍自...
荆州美食之旅,古城风味打卡推荐 荆州美食之旅,带你领略古城独特风味,这里汇聚了各种美食佳肴,让你回味无穷,从早餐的豆浆油条到午间的荆...
原创 员... 一场茶文化的盛事刚结束,比赛现场传出消息:由一位普通茶艺师所演绎的茶道表演,获得了观众的一致好评。尽...
原创 吃... #吃橙子的季节,你家橙皮都扔了?快捡起来洗洗这样做 寒冬腊月,正是吃橙子的好时节。那金黄圆润的果实...
香甜可口 外酥里糯 法式月饼 主料:鲜蛋黄3个、低筋面粉130克、黄油110克、奶油奶酪100克、糖粉85克 配料:朗姆酒少许、盐...
原创 吃... #吃火锅最不能忍的四种行为,第一种勉强接受,最后一种忍无可忍 作为一名热爱美食、尤其钟情于火锅的“...
原创 吃... #吃在嘴里,年在心里 “小孩儿小孩儿你别馋,过了腊八就是年。”当这首童谣在街头巷尾响起,年的脚步便...
形容美好的句子有哪些 形容美好的句子有哪些童年是一首忧郁的诗,赤诚却不明媚,美丽而不美好,有时甚至是羞于见人的,却让每个人...
流量余额显示0.00M是无限流... 流量余额显示0.00M是无限流量吗?流量显示0.00M.不是无线流量,是你没有流量了,你的包月流量用...
武动乾坤里林动跟林琅天谁厉害? 武动乾坤里林动跟林琅天谁厉害?在《武动乾坤》里面肯定是主角,更厉害的主角最后超过了所有人,没有人比他...
有关鲤鱼跳龙门的诗句~! 有关鲤鱼跳龙门的诗句~!最好是4句的贪看海蟾狂戏,不道九关齐闭《赠崔侍郎(其一)》作者:唐代·李白黄...
女孩姓朱的好听的名字 女孩姓朱的好听的名字欢馨(快乐,与家人生活得非常温馨)优璇(优,各个方面都很优秀;璇,像美玉一样美丽...
<<西厢记>... <<西厢记>>与<<牡丹亭>>有什么不同,哪部好看我认为都不好看
有个人说我命占狐仙 并且快出道... 有个人说我命占狐仙 并且快出道了 什么意思啊罘知道哦。听说谁的阿再看看别人怎么说的。罘知道哦。听说...
徒弟爱慕师傅的成语有哪些? 徒弟爱慕师傅的成语有哪些?好像并没有专门指代徒弟爱慕师傅的成语 情有独钟、流连忘返、一见钟情、恋恋...
我是职业钢管舞学校的学生,女生... 我是职业钢管舞学校的学生,女生,17岁了,每天都要穿大腿靴和紧身衣服练习,我的男朋友感觉他并不爱我不...
我龙傲天誓死守护刘波最早出自什... 我龙傲天誓死守护刘波最早出自什么我龙搭氏傲升孝天誓死守护刘波最早出自少年包青天,龙傲天出自电视剧《少...
小说前面的“楔子”是什么? 小说前面的“楔子”是什么?引子吧。简单介绍了主要人物及剧情长篇小说的组成部分之一,但并非部长篇小说所...
二次元必看十大动漫 二次元必看十大动漫同楼上, 每部动漫都有可看之处, 就看自己喜欢什么样的动漫了你直接去这个"2...