题目描述###

在一个4*4的棋盘上有8个黑棋和8个白棋,当且仅当两个格子有公共边,这两个格子上的棋是相邻的。移动棋子的规则是交换相邻两个棋子。现在给出一个初始棋盘和一个最终棋盘,要求你找出一个最短的移动序列使初始棋盘变为最终棋盘。

Klux说:“这么简单的题目,我都会做!”

输入格式:###

第1到4行每行四个数字(1或者0),描述了初始棋盘

接着是一个空行

第6到9行每行四个数字,描述了最终棋盘

输出格式:###

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

输入样例#1:

1111

0000

1110

0010

1010

0101

1010

0101

输出样例#1:

4

解题思路###

BFS+位运算。

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

注意这里面将棋盘转换成二进制序列的时候,如何计算序列上的值在原4*4棋盘上的位置,以及使用异或运算去生成相邻格子交换后的新棋盘状态对应的二进制序列也是本题特色。

最后,由于是交换相邻的格子,理论上格子和上下左右四个方向都可以互换,但是显然对于每个格子这样枚举互换存在大量的重复,本质上对于每个格子从上至下、从左到右只需要让他往右和往下和相邻的格子尝试互换即可。

#include<iostream>
#include<queue>
#define FOR(a,b,c) for(int a=(b);a<(c);a++)
using namespace std; const int maxn = 16;
struct Node{ // 结构体存棋盘的二进制序列和步数
int num,d;
};
int A,B;
int vis[100000]; void BFS() {
queue<Node> q;
q.push((Node){A,0});
while(!q.empty())
{
Node u=q.front(); q.pop();
int tmp=u.num;
if(tmp==B) { cout<<u.d; return ; }
for(int i=15;i>=0;i--) // 棋盘对应的二进制序列,从高到低依次枚举每个位置
{
int x=(15-i)/4,y=(15-i)%4,w=1<<i,z; //计算该位置在棋盘上的x和y坐标值
if(y<3 && (tmp&(1<<i))!=(tmp&(1<<i-1))) //向右交换,二进制序列的i和i-1交换
{
z=1<<i-1;
if(!vis[tmp^z^w]) {
vis[tmp^z^w]=1;
q.push((Node){tmp^z^w,u.d+1});
}
}
if(x<3 && (tmp&(1<<i))!=(tmp&(1<<i-4))) //向下交换,二进制序列的i和i-4交换
{
z=1<<i-4;
if(!vis[tmp^z^w]) {
vis[tmp^z^w]=1;
q.push((Node){tmp^z^w,u.d+1});
}
}
}
}
} int main()
{
char c;
for(int i=15;i>=0;i--) {
cin>>c;
if(c!='0') A += 1<<i;
}
for(int i=15;i>=0;i--) {
cin>>c;
if(c!='0') B += 1<<i;
}
if(A==B) cout<<0;
else BFS();
}

BFS —— 信息学一本通(1451:棋盘游戏)的更多相关文章

  1. 关于Hamilton问题的研究

    关于Hamilton问题的研究 首先介绍一下Hamilton问题:哈密顿问题寻找一条从给定的起点到给定的终点沿途恰好经过所有其他结点一次的路径.(摘自百度百科) 从刚开始学OI买了信息学一本通,这个问 ...

  2. 题解 P2272 【[ZJOI2007]最大半连通子图】

    P2272 [ZJOI2007]最大半连通子图 萌新初学Tarjan,在<信息学奥赛一本通-提高篇>中看到这题,看到题解不多,便想发布一篇较为清新简洁的题解.--第5道紫题 题目大意: 定 ...

  3. Pop Sequence 题解

    Pop Sequence(PAT) https://www.nowcoder.com/pat/5/problem/4090 前言: PAT上一道Stack的应用题,简化版的有<信息学一本通·普及 ...

  4. $ybt\ 【信息学奥赛一本通】题解目录$

    [信息学奥赛一本通]题解目录 $ \large -> OJ$ $ problem1000 $ \(Answer\) - > $ \large 1000$ $ problem1001 $ \ ...

  5. 信息学竞赛一本通提高版AC题解—例题1.1活动安排

    书中代码有误.书中为sort(a+1,a+n+1,Cmp). // // Created by yuxi on 19-1-13. // /* * * <信息学竞赛一本通-提高版>全部AC解 ...

  6. 【信息学奥赛一本通】第三部分_队列 ex2_3produce 产生数

    给出一个整数n(n<=2000)(代码可适用n<=10^31)和k个变换规则(k<=15). 规则:1.1个数字可以变换成另1个数字: 2.规则中右边的数字不能为零. BFS #in ...

  7. 2019寒假练题计划——LibreOJ刷题计划 &《信息学奥赛一本通》提高版题目

    目录 2019.1.27 #10082. 「一本通 3.3 例 1」Word Rings 题意 思路 #10083. 「一本通 3.3 例 2」双调路径 题意 思路 #10084. 「一本通 3.3 ...

  8. 九度OJ 1091:棋盘游戏 (DP、BFS、DFS、剪枝)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1497 解决:406 题目描述: 有一个6*6的棋盘,每个棋盘上都有一个数值,现在又一个起始位置和终止位置,请找出一个从起始位置到终止位置代 ...

  9. Keyboarding(信息学奥赛一本通-T1452)

    [题目描述] 出自 World Final 2015 F. Keyboarding 给定一个 r 行 c 列的在电视上的"虚拟键盘",通过「上,下,左,右,选择」共 5 个控制键, ...

随机推荐

  1. 原生JS实现简易评论更新功能

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. 微信小程序注意点与快捷键

    注意点1. 微信对小程序的要求是整体大小不能超过1MB. 2. .json 是配置文件,其内容必须符合JSON格式,所以文件内部不允许有注释. 3. app.json 是全局配置文件,微信小程序中的每 ...

  3. HDU - 1062

    格式错误2遍:没考虑到连续两个空格的情况,遇到空格最后要输出这个空格,因为题目只需要转换单词. 另外,开cin,cout加速要注意读入不能用scanf,printf,puts,getchar这些.ge ...

  4. selenium采用find_element_by方法识别页面元素

    主要是练习获取页面中的各元素,马克 # coding:utf-8 import time from selenium import webdriver import unittest from pyt ...

  5. tar解压指定文件

    import tarfileimport sys#tar = tarfile.open('/opt/platform-omp/omp.tar.gz','r')tar = tarfile.open(r' ...

  6. Gitlab_ansible_jenkins三剑客⑤jenkins Pipeline-job的使用

    Pipeline-job的使用 创建Pipeline任务 找到root用户的id 编写pipeline脚本 #!groovy pipeline{ agent {node {label 'master' ...

  7. sqlserver 获取汉字拼音的首字母(大写)函数

    1:创建函数: USE [test] GO /****** 对象: UserDefinedFunction [dbo].[GetFirstChar] 脚本日期: 02/22/2019 16:39:06 ...

  8. 将mysql中的一张表中的一个字段数据根据条件导入另一张表中

    添加字段:alter table matInformation add facid varchar(99)  default ''; 导入数据:update matInformation m set ...

  9. ajax 调用 .net core WebAPI,报错 400 (Bad Request) Unexpected character encountered while parsing value

    此文由博主前两天的提问及 dudu 的回答整理,地址:https://q.cnblogs.com/list/myquestion 情况说明 基于 .net core 写了一个 Web API,用 po ...

  10. scrapy 爬取时很多重复 及日志输出

    日志输出参考:https://blog.csdn.net/weixin_41666747/article/details/82716688 首先 item 要设置循环外 第二,request 要设置下 ...