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 ...
随机推荐
- thinkphp5.0 使用action()报Cannot redeclare app\home\controller\CheckSubstrs()错误
原因:Common公共类方法isMobile()内部定义了函数CheckSubstrs(),在使用action()时,会调用两次isMobile(),导致函数CheckSubstrs()重复定义 解决 ...
- 从零学React Native之07View
View 组件是React Native最基本的组件.绝大部分其他React Native 组件. View组件的颜色和边框 backgroundColor 键用来指定颜色. RN 0.19版本开始, ...
- Java练习 SDUT-2585_机器人II
机器人II Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 自从xiao_wu发明了只能向左转与向右转的机器人以后,热血 ...
- 创建我的flask第一个应用(二)
继上一篇创建我的flask第一个应用(一),继续学习配置flask 在myproject未提供flask默认运行的主程序文件"wsgi.py"或"app.py" ...
- poj 1436 && zoj 1391 Horizontally Visible Segments (Segment Tree)
ZOJ :: Problems :: Show Problem 1436 -- Horizontally Visible Segments 用线段树记录表面能被看见的线段的编号,然后覆盖的时候同时把能 ...
- phpstorm鼠标显示问题
https://segmentfault.com/q/1010000004319802 使用phpstorm,不知道碰到了什么键,鼠标变成了一个字符那么宽的灰色色块,原来是一根很细的竖线,怎么弄?没法 ...
- PL/SQL语言的学习笔记
一.PL/SQL简介1.什么是PL/SQL程序?(PL/SQL是对SQL语言的一个扩展,从而形成的一个语言) 2.PL/SQL语言的特点(操作Orcale数据库效率最高的就是PL/SQL语言,而不是C ...
- yii框架不输出头文件和尾文件
控制器: public function actionCat(){ return $this->renderPartial('cat');} 在进行页面输出渲染的时候. 1.render 输出父 ...
- [C++] 获取IE代理服务器的账号密码
很多程序需要使用'浏览器设置'的代理服务器,IE设置的代理服务器有可能是需要账号密码的.怎样编程获取浏览器设置的代理服务器的账号密码呢? InternetQueryOption(NULL, INTER ...
- 《Spring 5官方文档》 Spring AOP的经典用法
原文链接 在本附录中,我们会讨论一些初级的Spring AOP接口,以及在Spring 1.2应用中所使用的AOP支持. 对于新的应用,我们推荐使用 Spring AOP 2.0来支持,在AOP章节有 ...