zoukankan      html  css  js  c++  java
  • 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 }
     
  • 相关阅读:
    ES6笔记分享 part 2
    ES6笔记分享 part 1
    JS事件之自建函数bind()与兼容性问题解决
    JavaScript DOM事件对象的两个小练习 | 学习内容分享
    JavaScript数组的方法 | 学习笔记分享
    JavaScript构造函数 | 学习笔记分享
    Hexo+Github个人博客搭建 | 实战经验分享
    Hello world!
    “1+X”证书Web前端开发等级考试简介
    1+x证书Web 前端开发初级——理论考试(试卷1)
  • 原文地址:https://www.cnblogs.com/qinqin-me/p/12283167.html
Copyright © 2011-2022 走看看