【位运算】【BFS】移动玩具
1054: [HAOI2008]移动玩具
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 2246 Solved: 1246
[Submit][Status][Discuss]
Description
Input
Output
一个整数,所需要的最少移动次数。
Sample Input
0000
1110
0010
1010
0101
1010
0101
Sample Output
HINT
Source
试题分析:也许太闲的了,我竟然使位运算写这题(一时脑抽)……
简简单单的BFS,正解再加个HASH搞定
想想我这样好像还省了个Hash QAQ
代码(大神勿喷)
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<stack>
#include<vector>
#include<algorithm>
//#include<cmath> using namespace std;
const int INF = 9999999;
#define LL long long inline int read(){
int x=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
int N,E;
bool vis[65539];
char c;
int l=1,r=1;
struct data{
int st,k;
}Que[700001]; void BFS(){
Que[l].st=0,Que[l].k=N;
int step,Now;
if(Que[l].k==E){
printf("%d\n",Que[l].st);
return ;
}
while(l<=r){
Now=Que[l].k,step=Que[l].st;
for(int i=1;i<=4;i++){
for(int j=1;j<=4;j++){
if(((Now>>((4-i)*4+4-j))&1)){
for(int p=0;p<4;p++){
if(p==0&&i!=1&&!((Now>>((4-(i-1))*4+4-j))&1)&&!vis[Now-(1<<((4-i)*4+4-j))+(1<<((4-i)*4+8-j))]){
Que[++r].k=Now-(1<<((4-i)*4+4-j))+(1<<((4-i)*4+8-j));
if(Que[r].k==E){
printf("%d\n",step+1);
return ;
}
Que[r].st=step+1;
vis[Que[r].k]=1;
}
if(p==1&&i!=4&&!((Now>>((4-(i+1))*4+4-j))&1)&&!vis[Now-(1<<((4-i)*4+4-j))+(1<<((4-i)*4-j))]){
Que[++r].k=Now-(1<<((4-i)*4+4-j))+(1<<((4-i)*4-j));
if(Que[r].k==E){
printf("%d\n",step+1);
return ;
}
Que[r].st=step+1;
vis[Que[r].k]=1;
}
if(p==2&&j!=1&&!((Now>>((4-i)*4+4-(j-1)))&1)&&!vis[(1<<((4-i)*4+4-j))+(1<<((4-i)*4+4-(j-1)))]){
Que[++r].k=Now-(1<<((4-i)*4+4-j))+(1<<((4-i)*4+4-(j-1)));
if(Que[r].k==E){
printf("%d\n",step+1);
return ;
}
Que[r].st=step+1;
vis[Que[r].k]=1;
}
if(p==3&&j!=4&&!((Now>>((4-i)*4+4-(j+1)))&1)&&!vis[Now-(1<<((4-i)*4+4-j))+(1<<((4-i)*4+4-(j+1)))]){
Que[++r].k=Now-(1<<((4-i)*4+4-j))+(1<<((4-i)*4+4-(j+1)));
if(Que[r].k==E){
printf("%d\n",step+1);
return ;
}
Que[r].st=step+1;
vis[Que[r].k]=1;
}
}
}
}
} l++;
}
} int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
int tmp=16;
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++){
cin>>c;
N=N+(1<<(tmp-1))*(c-'0');
tmp--;
}
vis[N]=true;
tmp=16;
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++){
cin>>c;
E=E+(1<<(tmp-1))*(c-'0');
tmp--;
}
BFS();
return 0;
}
【位运算】【BFS】移动玩具的更多相关文章
- POj 1753--Flip Game(位运算+BFS)
Flip Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 30669 Accepted: 13345 Descr ...
- hdu-5637 Transform(位运算+bfs)
题目链接: Transform Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Other ...
- P1457 城堡 The Castle 位运算+BFS+思维(难题,好题)
题目描述 我们憨厚的USACO主人公农夫约翰(Farmer John)以无法想象的运气,在他生日那天收到了一份特别的礼物:一张"幸运爱尔兰"(一种彩票).结果这张彩票让他获得了这次 ...
- 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:求最少的步骤.使得 ...
- 【BFS】【位运算】解药还是毒药
[codevs2594]解药还是毒药 Description Smart研制出对付各种症状的解药,可是他一个不小心,每种药都小小地配错了一点原料,所以这些药都有可能在治愈某些病症的同时又使人患上某些别 ...
- Vijos 1206 CoVH之再破难关 [BFS] [位运算]
1.题意:一个由01组成的4*4的矩阵,可以实现相邻元素交换位置的操作,给出初试状态和目标状态,试求最少操作数的方案: 2.输入输出:输入给出初试矩阵和目标矩阵:要求输出最小操作的次数: 3.分析:输 ...
- POJ 1166 The Clocks [BFS] [位运算]
1.题意:有一组3*3的只有时针的挂钟阵列,每个时钟只有0,3,6,9三种状态:对时针阵列有9种操作,每种操作只对特点的几个时钟拨一次针,即将时针顺时针波动90度,现在试求从初试状态到阵列全部指向0的 ...
- POJ 1753 位运算+枚举
题意: 给出4*4的棋盘,只有黑棋和白棋,问你最少几步可以使棋子的颜色一样. 游戏规则是:如果翻动一个棋子,则该棋子上下左右的棋子也会翻一面,棋子正反面颜色相反. 思路: 都是暴搜枚举. 第一种方法: ...
随机推荐
- centos6.5下安装svn并且实现多项目管理配置方案
#安装SVN服务器 yum install subversion #在home下创建svn根目录 mkdir /home/svn #在 /home/svn下创建pro1 , pro2, pro3 三个 ...
- 多重部分和问题 (dp)
题目描述 有n种不同大小的数字Ai,每种各Mi个.判断是否能从这些数字中选出若干个使它们的和恰好为K. 这个问题可以用DP求解,递推关系式的定义会影响最终的复杂度. 第一种定义: dp[i+1][j] ...
- vue router mode 设置"hash"与"history"的区别
router官网的说明如下: ********************************************我是官网说明分隔符--开始**************************** ...
- 3.0docker操作
登录镜像资源 docker login daocloud.io username: password: docker login : 登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方 ...
- chromedriver版本 支持的Chrome版本
在使用selenium测试时,如果选择chrome浏览器,需要将chrome driver的exe文件放在项目下 错误的driver版本,会导致无法正常打开本机的浏览器 以下为对应关系 来自网络 ch ...
- Ubuntu 14.04 ThinkPad E431无线网卡驱动安装
Ubuntu 14.04下安装无线网卡驱动. sudo apt-get install linux-headers-generic build-essential dkms sudo apt-get ...
- java===java基础学习(14)---封装
package dog; public class Demo4 { public static void main(String []args) { Worker w1= new Worker(&qu ...
- TensorFlow计算模型—计算图
TensorFlow是一个通过计算图的形式来表述计算的编程系统.其中的Tnesor,代表它的数据结构,而Flow代表它的计算模型.TensorFlow中的每一个计算都是计算图上的一个节点,而节点之间的 ...
- 内核添加USB模块
Device Drivers->SCSI device support->SCSI disk support Device Drivers->USB support->Supp ...
- [路由] -- Yii2 url地址美化与重写
转载:http://blog.csdn.net/lmjy102/article/details/53857520