BFS(广度优先搜索华容道游戏)--11--BFS--蓝桥杯卡片换位
题目描述
你玩过华容道的游戏吗?这是个类似的,但更简单的游戏。看下面 3 x 2 的格子
你可以把一张牌移动到相邻的空格中去(对角不算相邻)。
游戏的目标是:关羽和张飞交换位置,其它的牌随便在哪里都可以。
+---+---+---+ | A | * | * | +---+---+---+ | B | | * | +---+---+---+在其中放5张牌,其中A代表关羽,B代表张飞,* 代表士兵。还有一个格子是空着的。
你可以把一张牌移动到相邻的空格中去(对角不算相邻)。
游戏的目标是:关羽和张飞交换位置,其它的牌随便在哪里都可以。
输入
输入存在多组测试数据,对于每组测试数据:
输入两行6个字符表示当前的局面
输入两行6个字符表示当前的局面
输出
对于每组测试数据输出一个整数表示答案
样例输入 Copy
* A
**B
A B
***
样例输出 Copy
17
12
分析:
1.此题时时刻刻抓住A、B、空格这三个点的位置,知道这三个点的位置等于知道整张图,通过sig数组来记录三点的行和列位置,从而记录整张图
2.BFS的起点是空格,后面遍历也是空格,遍历到哪儿,空格就在哪儿
3.向空格上下左右遍历,如遇到A点或B点,需交换空格与A点、B点的位置,也就是更新空格,A点,B点三点的位置。
4.遍历需要记录图的时时情况的,如果情况重复则不进行下去,如果此图的情况未出现过才进行
5.直到A、B两点位置交换的图的情况出现终止,并输出步数
1 #include <iostream> 2 #include <algorithm> 3 #include <string> 4 #include <string.h> 5 #include <vector> 6 #include <queue> 7 #include <cstdio> 8 #include <iomanip> 9 using namespace std; 10 11 const int ROW = 2; 12 const int COL = 3; 13 char matrix[ROW][COL]; 14 int arow,brow,acol,bcol,row,col; 15 int dd[4][2] = {0,1,0,-1,1,0,-1,0}; 16 int sig[ROW][COL][ROW][COL][ROW][COL]; 17 18 struct Node { 19 int i,j; 20 int ai,aj; 21 int bi,bj; 22 int step; 23 }; 24 25 26 void bfs() { 27 queue<Node> q; 28 Node now; 29 now.i = row; 30 now.j = col; 31 now.ai = arow;now.aj = acol; 32 now.bi = brow;now.bj = bcol; 33 now.step = 0; 34 q.push(now); 35 while (!q.empty()) { 36 now = q.front(); 37 q.pop(); 38 if(sig[now.ai][now.aj][now.bi][now.bj][now.i][now.j] == 1) 39 continue; 40 sig[now.ai][now.aj][now.bi][now.bj][now.i][now.j] = 1; 41 if(now.ai == brow && now.aj == bcol && now.bi == arow && now.bj == acol ) { 42 cout<< now.step <<endl; 43 return ; 44 } 45 for (int i = 0;i < 4;i++) { 46 int ii = now.i + dd[i][0]; 47 int jj = now.j + dd[i][1]; 48 if (ii < 0 || ii >= ROW || jj < 0 || jj >= COL) 49 continue; 50 Node zz = now; 51 zz.i = ii;zz.j = jj; 52 zz.step++; 53 if (ii == now.ai && jj == now.aj) { 54 zz.aj = now.j; 55 zz.ai = now.i; 56 } 57 if (ii == now.bi && jj == now.bj) { 58 zz.bj = now.j; 59 zz.bi = now.i; 60 } 61 if (sig[zz.ai][zz.aj][zz.bi][zz.bj][zz.i][zz.j]) 62 continue; 63 q.push(zz); 64 } 65 } 66 } 67 68 int main() { 69 while (gets(matrix[0]) != NULL ) { 70 gets(matrix[1]); 71 memset(sig,0, sizeof(sig)); 72 for (int i = 0; i < ROW; i++) { 73 for (int j = 0; j < COL; j++) { 74 if (matrix[i][j] == ' ') { 75 row = i; 76 col = j; 77 } 78 if (matrix[i][j] == 'A') { 79 arow = i; 80 acol = j; 81 } 82 if (matrix[i][j] == 'B') { 83 brow = i; 84 bcol = j; 85 } 86 } 87 } 88 bfs(); 89 } 90 return 0; 91 }
可以的话,记得帮我点个推荐,然后收藏+关注哟