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 ...
随机推荐
- UVa 10323 【数学】
UVa 10323 题目:计算阶乘在10000~6227020800之间的值,不在范围对应输出Under或者Over. 分析:简单题.数论.因为13!=6227020800,7!<10000&l ...
- hibernate 出现Caused by: java.sql.SQLException: Column 'id' not found.异常
用hibernate进行映射查询时,出现Caused by: java.sql.SQLException: Column 'id' not found 异常,检查数据库表及映射都有id且已经正确映射, ...
- C运行时库函数
C运行时库函数是指C语言本省支持的一些基本函数,通常是汇编直接实现的. API函数是操作系统提供给用户方便设计应用程序的函数,实现一些特定的功能,API函数也是C语言的函数实现的. 他们之间区别是: ...
- vue项目配置同一局域网可使用ip访问
1.检查 package.json文件,scripts.dev设置 host改成 "0.0.0.0" 2.config文件中找到 index.js 文件的host改成 " ...
- SQLSTATE[HY000] [2002] 错误
http://www.thinkphp.cn/topic/36194.html 使用tp框架 3.2.3 ,在windows上跑的时候没有任何问题,但是部署到linux系统和是哪个,就会报这个错,不知 ...
- H3C 总线型以太网拓扑扩展
- 利用 jquery 获取某个元素下的所有图片并改变其属性
HTML代码 <div id="mochu"> <p>内容....<./p> <p><img src="xxxx.p ...
- iptables在我们的网络机房实现NAT共享上网
工作环境:上层代理192.168.60.6(4480),只授予教师机(192.168.62.111)使用该代理的权限 目标:不使用squid代理上网,而是使用NAT的方式上网 方法: 1) 确保停止教 ...
- Vue 语法的一些小问题
设置 sty行内样式 :style="{width:mapWidth,height:mapHeight}" This指向 axios 使用axios 的时候 ,在生命周期函数 ...
- Koa2 遇到Method Not Allowed 获取不到返回值
https://q.cnblogs.com/q/114462/ 都来找我 Haisen‘s blogs 求求各位大神了,2点多了没解决睡不着啊,我按照网上用的koa2-cors,g ...