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 ...
随机推荐
- hdu2018 dp
/* 1~4直接取得: 然后后面的生牛的时候都是前一年的加上一定的数. 从第5年看,第五年出生的牛肯定要加上第四年出生的,然后由于第一个出生的牛开始生小牛,这和 最开始的牛生孩子是一样的,所以+dp[ ...
- java对象转化为json字符串并传到前台
package cc.util; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import ...
- @atcoder - CODE FESTIVAL 2017 Final - J@ Tree MST
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定 N 个点,第 i 点有一个点权 Xi,再给定一棵边带权的树 ...
- 1、Ubuntu 16.04 安装.net core
Register the Microsoft key register the product repository Install required dependencies 参考网址:https: ...
- @hdu - 6372@ sacul
目录 @description@ @solution@ @accepted code@ @details@ @description@ 定义矩阵 \(A_i\) 是一个大小为 \(p^i*p^i\) ...
- Linux下的一些配置
/etc/vim/vimrc文件 set cindent set expandtab set smartindent set autoindent set nu set hls taglist安装(t ...
- DOMjudge配置
DOMjudge配置补充 系统环境为 Debbian GNU/Linux 9 (stretch) 64-bit 在Web server configuration中, ln -s etc/apache ...
- landi pos机
2015年3月:联迪商用获得2014-2015中国金融POS机市场年度成功企业奖: 2014年5月:联迪商用入选2013年福州市纳税百强企业: 2013年12月:联迪商用入选2013年度中国电子商务物 ...
- Python--day22--面向对象的交互
Python里面自带的类和对象: 类名的作用: 类里面的与属性相关的对象self的运用: 实例化:就是创建一个对象 调用方法,类名.方法名(对象名) 执行步骤: 简写:alex.walk()等价于Pe ...
- tensorflow学习笔记(四十五):sess.run(tf.global_variables_initializer()) 做了什么?
当我们训练自己的神经网络的时候,无一例外的就是都会加上一句 sess.run(tf.global_variables_initializer()) ,这行代码的官方解释是 初始化模型的参数.那么,它到 ...