zoukankan      html  css  js  c++  java
  • 洛谷P1117 棋盘游戏

    洛谷1117 棋盘游戏

    题目描述

    在一个4*4的棋盘上有8个黑棋和8个白棋,当且仅当两个格子有公共边,这两个格子上的棋是相邻的。移动棋子的规则是交换相邻两个棋子。现在给出一个初始棋盘和一个最终棋盘,要求你找出一个最短的移动序列使初始棋盘变为最终棋盘。
    Klux说:“这么简单的题目,我都会做!”

    输入输出格式

    输入格式:

    第1到4行每行四个数字(1或者0),描述了初始棋盘
    接着是一个空行
    第6到9行每行四个数字,描述了最终棋盘

    输出格式:

    输出文件的只有一行是一个整数n,表示最少的移动步数。

    输入输出样例

    输入样例#1:

    1111

    0000

    1110

    0010

     

    1010

    0101

    1010

    0101

    输出样例#1:

    4

    【思路】

      宽搜+位运算。

      由于要求最小步数可以看出BFS的基本框架,但是如果用矩阵存储状态的话太耗费空间而且很慢,注意到每个格子的状态非0即1而且总格子数目为16所以可以用二进制的方法存储状态,相应判断,转移,判重。

      详见代码。

    【代码】

     1 #include<iostream>
     2 #include<queue>
     3 #define FOR(a,b,c) for(int a=(b);a<(c);a++)
     4 using namespace std;
     5 
     6 const int maxn = 16;
     7 struct Node{
     8     int num,d;
     9 };
    10 int A,B;
    11 int vis[100000];
    12 
    13 
    14 void BFS() {
    15 queue<Node> q;
    16     q.push((Node){A,0});
    17     while(!q.empty()) {
    18         Node u=q.front(); q.pop();
    19         int tmp=u.num;
    20         if(tmp==B) { cout<<u.d; return ; }
    21         for(int i=15;i>=0;i--) 
    22         {
    23             int x=(15-i)/4,y=(15-i)%4,w=1<<i,z;
    24             if(y<3 && (tmp&(1<<i))!=(tmp&(1<<i-1))) {
    25                 z=1<<i-1;
    26                 if(!vis[tmp^z^w]) {
    27                     vis[tmp^z^w]=1;
    28                     q.push((Node){tmp^z^w,u.d+1});
    29                 }
    30             }
    31             if(x<3 && (tmp&(1<<i))!=(tmp&(1<<i-4))) {
    32                 z=1<<i-4;
    33                 if(!vis[tmp^z^w]) {
    34                     vis[tmp^z^w]=1;
    35                     q.push((Node){tmp^z^w,u.d+1});
    36                 }
    37             }
    38         }
    39     }
    40 }
    41 
    42 int main() {
    43     ios::sync_with_stdio(false);
    44     char c;
    45     for(int i=15;i>=0;i--) {
    46         cin>>c;
    47         if(c!='0')  A += 1<<i;
    48     }
    49     for(int i=15;i>=0;i--) {
    50         cin>>c;
    51         if(c!='0')  B += 1<<i;
    52     }
    53     if(A==B) cout<<0;
    54     else BFS();
    55 }

    另外STL的queue一定程度上的减慢速度,可以用d[][2]数组代替。

  • 相关阅读:
    【Docker 命令】- ps命令
    【Docker 命令】- exec命令
    【Docker 命令】- create命令
    【Docker 命令】- pause/unpause 命令
    【Docker 命令】- rm命令
    【Docker 命令】- kill命令
    【Docker 命令】- start/stop/restart命令
    【Docker 命令】- run命令
    【Docker】- 基本命令
    深度学习原理与框架- batch_normalize(归一化操作)
  • 原文地址:https://www.cnblogs.com/lidaxin/p/4860401.html
Copyright © 2011-2022 走看看