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 }
     
  • 相关阅读:
    Spring Boot 2 快速教程:WebFlux Restful CRUD 实践(三)
    Spring Boot 2 快速教程:WebFlux 快速入门(二)
    ES 集群上,业务单点如何优化升级?
    Spring Boot 2.x 系列教程:WebFlux 系列教程大纲(一)
    泥瓦匠想做一个与众不同的技术"匠"
    java编程行业微信群,无论新手老手欢迎加入,会一直更新
    Spring Boot 2.x 系列教程:WebFlux REST API 全局异常处理 Error Handling
    解决方案:如何防止数据重复插入?
    阿里 Java 手册系列教程:为啥强制子类、父类变量名不同?
    品阿里 Java 开发手册有感
  • 原文地址:https://www.cnblogs.com/qinqin-me/p/12283167.html
Copyright © 2011-2022 走看看