Vijos 1206 CoVH之再破难关 [BFS] [位运算]
1.题意:一个由01组成的4*4的矩阵,可以实现相邻元素交换位置的操作,给出初试状态和目标状态,试求最少操作数的方案;
2.输入输出:输入给出初试矩阵和目标矩阵;要求输出最小操作的次数;
3.分析:输出最小操作数,很容易联想到使用BFS,这里为了方便表示,把4*4的矩阵拉成一个16个数的数组来看,并用一个16位二进制数表示其状态;用位运算来实现交换某两位的状态,另外再稍微注意一下如何在表示"相邻"的概念即可;
# include <iostream>
# include <cstdio>
# include <queue>
# include <cstring>
using namespace std;
const int MAXN=<<;
int vis[MAXN];
int START,END;
int dx[]={-,,,-};
void swap(int &a,int &b)
{
int t;
t=a;
a=b;
b=t;
}
struct Node
{
int step,num;
Node(){}
Node(int ss,int nn)
{
step=ss;
num=nn;
}
};
void Init()
{
char M[][];
END=START=;
for(int i=;i<;i++)
scanf("%s",M[i]);
for(int i=;i<;i++)
for(int j=;j<;j++)
START|=((int(M[i][j]-''))<<(*i+j));
for(int i=;i<;i++)
scanf("%s",M[i]);
for(int i=;i<;i++)
for(int j=;j<;j++)
END|=((int(M[i][j]-''))<<(*i+j));
memset(vis,,sizeof(vis));
}
int change(int i,int j,int n)
{
int nt=n;
int temp=n;
int subi=(n>>i)&;//取出i位
int subj=(temp>>j)&;//取出j位
swap(subi,subj);
nt&=(((<<)-)^(<<i));
nt&=(((<<)-)^(<<j));
nt|=(subi<<i);
nt|=(subj<<j);
return nt;
}
void Solve()
{ int ans=-;
queue<Node> Q;
Q.push(Node(,START));
while(!Q.empty())
{
Node temp=Q.front();
Q.pop();
if(temp.num==END)
{
ans=temp.step;
break;
}
for(int i=;i<;i++)
for(int j=;j<;j++)
{
int t=temp.num;
if(dx[j]==-||dx[j]==)
{
if((i/)==((i+dx[j])/)&&(i+dx[j])>=&&(i+dx[j])<)
{
int nt=change(i,i+dx[j],t);
if(!vis[nt])
{
Q.push(Node(temp.step+,nt));
vis[nt]=;
}
}
}
else
{
if((i+dx[j])<&&(i+dx[j])>=)
{
int nt=change(i,i+dx[j],t);
if(!vis[nt])
{
Q.push(Node(temp.step+,nt));
vis[nt]=;
}
}
}
}
}
printf("%d\n",ans);
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
Init();
Solve();
return ;
}
Vijos 1206 CoVH之再破难关 [BFS] [位运算]的更多相关文章
- 【宽搜】Vijos P1206 CoVH之再破难关
题目链接: https://vijos.org/p/1206 题目大意: 给你开始和结束两张4x4的01图,每次操作只能够交换相邻的两个格子(有公共边),问最少的操作步数. 题目思路: [搜索] 这题 ...
- HDU5627--Clarke and MST (bfs+位运算)
http://www.cnblogs.com/wenruo/p/5188495.html Clarke and MST Time Limit: 2000/1000 MS (Java/Others) M ...
- POJ 1753 bfs+位运算
T_T ++运算符和+1不一样.(i+1)%4 忘带小括号了.bfs函数是bool 型,忘记返回false时的情况了.噢....debug快哭了...... DESCRIPTION:求最少的步骤.使得 ...
- POJ 1166 The Clocks [BFS] [位运算]
1.题意:有一组3*3的只有时针的挂钟阵列,每个时钟只有0,3,6,9三种状态:对时针阵列有9种操作,每种操作只对特点的几个时钟拨一次针,即将时针顺时针波动90度,现在试求从初试状态到阵列全部指向0的 ...
- POJ 1753 Flip Game (状态压缩 bfs+位运算)
Flip game is played on a rectangular 4x4 field with two-sided pieces placed on each of its 16 square ...
- hdu 1885 Key Task(bfs+位运算)
题意:矩阵中'#'表示墙,'.'表示通路,要求从起点'*'到达终点'X',途中可能遇到一些门(大写字母),要想经过,必须有对应的钥匙(小写字母).问能否完成,若能,花费的时间是多少. 分析:同hdu ...
- poj 2965 The Pilots Brothers' refrigerator枚举(bfs+位运算)
//题目:http://poj.org/problem?id=2965//题意:电冰箱有16个把手,每个把手两种状态(开‘-’或关‘+’),只有在所有把手都打开时,门才开,输入数据是个4*4的矩阵,因 ...
- 【BFS】【位运算】解药还是毒药
[codevs2594]解药还是毒药 Description Smart研制出对付各种症状的解药,可是他一个不小心,每种药都小小地配错了一点原料,所以这些药都有可能在治愈某些病症的同时又使人患上某些别 ...
- 【位运算】【BFS】移动玩具
1054: [HAOI2008]移动玩具 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2246 Solved: 1246[Submit][Stat ...
随机推荐
- Java练习 SDUT-3848_Shift Dot
Shift Dot Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 给出平面直角坐标系中的一点,并顺序给出n个向量,求该 ...
- js 获取js自身参数
页面中有<script id="comjs" src="js/common.js?cname=mad&cid=500&uid=smpx"& ...
- 判断php的运行模式
我们一般情况下,都是在apache下面运行我们的php程序,当然也有些人是用IIS环境的 我们要是想知道我们目前运行的环境是什么的话,那我们可以用函数php_sapi_name()来测试 代码: &l ...
- JS 的私有成员为什么钦定了 #?
翻译自 tc39/proposal-class-fields 译者按:社区一直以来有一个声音,就是反对使用 # 声明私有成员.但是很多质疑的声音过于浅薄.人云亦云.其实 TC39 早就对此类呼声做过回 ...
- H3C 命令级别
- Core Data 数据出现Fault
I am mapping Json Data from Server using Restkit and I am Displaying those data by fetching from db. ...
- sublime text 3创建新文件插件-AdvanceNewFile
这里要记录sublime text 3 在创建新文件时安装的插件–AdvanceNewFile ST本来自带的创建新文件的快捷键是ctrl+n.但是用户需要保存时才可修改名称以及文件路径.但是安装完A ...
- MVC插件式开发平台
---恢复内容开始--- 经过DyOS.BraveOS1.0再到BraveOS2.0,系统现在已经开发了下载. 我们的目标是,网页版操作系统,可以在线安装更新软件,并提供二次开发平台,提供基础的逻辑和 ...
- Java反射机制(四):动态代理
一.静态代理 在开始去学习反射实现的动态代理前,我们先需要了解代理设计模式,那何为代理呢? 代理模式: 为其他对象提供一种代理,以控制对这个对象的访问. 先看一张代理模式的结构图: 简单的理解代理设计 ...
- pytorch入坑一 | Tensor及其基本操作
由于之前的草稿都没了,现在只有重写…. 我好痛苦 本章只是对pytorch的常规操作进行一个总结,大家看过有脑子里有印象就好,知道有这么个东西,需要的时候可以再去详细的看,另外也还是需要在实战中多运用 ...