BFS(广度优先搜索华容道游戏)--11--BFS--蓝桥杯卡片换位

题目描述

你玩过华容道的游戏吗?这是个类似的,但更简单的游戏。看下面 3 x 2 的格子
    +---+---+---+
    | A | * | * | 
    +---+---+---+
    | B |   | * |
    +---+---+---+
在其中放5张牌,其中A代表关羽,B代表张飞,* 代表士兵。还有一个格子是空着的。
你可以把一张牌移动到相邻的空格中去(对角不算相邻)。
游戏的目标是:关羽和张飞交换位置,其它的牌随便在哪里都可以。 

输入

输入存在多组测试数据,对于每组测试数据: 
输入两行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 }
 
原文地址:https://www.cnblogs.com/qinqin-me/p/12283167.html