题意:在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移动次数将初的玩具状态移动到某人心中的目标状态。

题解:状压状态,然后bfs时枚举每一位向四个方向转移即可,记得加vis,表示已经访问过的状态

/**************************************************************
Problem: 1054
User: walfy
Language: C++
Result: Accepted
Time:28 ms
Memory:6176 kb
****************************************************************/ //#pragma comment(linker, "/stack:200000000")
//#pragma GCC optimize("Ofast,no-stack-protector")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//#pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pi acos(-1.0)
#define ll long long
#define vi vector<int>
#define mod 1000000007
#define C 0.5772156649
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#define pil pair<int,ll>
#define pli pair<ll,int>
#define pii pair<int,int>
#define cd complex<double>
#define ull unsigned long long
#define base 1000000000000000000
#define fio ios::sync_with_stdio(false);cin.tie(0) using namespace std; const double eps=1e-6;
const int N=1000000+10,maxn=1000000+10,inf=0x3f3f3f3f,INF=0x3f3f3f3f3f3f3f3f; bool vis[N];
int dis[N];
bool left(int u,int i)
{
if(i!=0&&i!=4&&i!=8&&i!=12&&(!((u>>(i-1))&1)))return 1;
return 0;
}
bool right(int u,int i)
{
if(i!=3&&i!=7&&i!=11&&i!=15&&(!((u>>(i+1))&1)))return 1;
return 0;
}
bool up(int u,int i)
{
if(i!=0&&i!=1&&i!=2&&i!=3&&(!((u>>(i-4))&1)))return 1;
return 0;
}
bool down(int u,int i)
{
if(i!=12&&i!=13&&i!=14&&i!=15&&(!((u>>(i+4))&1)))return 1;
return 0;
}
void bfs(int x,int y)
{
vis[x]=1;
queue<int>q;
q.push(x);
while(!q.empty())
{
int u=q.front();
if(u==y)
{
printf("%d\n",dis[u]);
return ;
}
q.pop();
for(int i=0;i<16;i++)
{
if((u>>i)&1)
{
if(left(u,i))
{
int te=u^(1<<i)^(1<<(i-1));
if(!vis[te])
{
q.push(te);
dis[te]=dis[u]+1;
vis[te]=1;
}
}
if(right(u,i))
{
int te=u^(1<<i)^(1<<(i+1));
if(!vis[te])
{
q.push(te);
dis[te]=dis[u]+1;
vis[te]=1;
}
}
if(up(u,i))
{
int te=u^(1<<i)^(1<<(i-4));
if(!vis[te])
{
q.push(te);
dis[te]=dis[u]+1;
vis[te]=1;
}
}
if(down(u,i))
{
int te=u^(1<<i)^(1<<(i+4));
if(!vis[te])
{
q.push(te);
dis[te]=dis[u]+1;
vis[te]=1;
}
}
}
}
}
}
char s[5];
int main()
{
int x=0,y=0;
for(int i=0;i<4;i++)
{
scanf("%s",s);
for(int j=0;j<4;j++)
if(s[j]=='1')
x+=(1<<(i*4+j));
}
for(int i=0;i<4;i++)
{
scanf("%s",s);
for(int j=0;j<4;j++)
if(s[j]=='1')
y+=(1<<(i*4+j));
}
bfs(x,y);
return 0;
}
/******************** ********************/

bzoj1054: [HAOI2008]移动玩具 状压+爆搜即可的更多相关文章

  1. [HAOI2008]移动玩具 状压

    发现自己只会打状压了. 233333 不需要考虑是否会被挡,所以直接dp #include<cstdio> #include<cstring> #include<iost ...

  2. 【Luogu】P4363一双木棋(状压爆搜)

    题目链接 唉,只有AC了这道题才会感叹考场上没有想出解法的我是多么智障. 我甚至连任何想法都没有. 天啊我当时到底在想些什么. AC这道题我就能进前15了诶. 我们发现只要确定了轮廓线那么此时的状态就 ...

  3. bzoj1054: [HAOI2008]移动玩具

    hash+bfs:要注意特殊情况.(似乎连sort.lower_bound都不用数据小直接判重了... #include<cstdio> #include<cstring> # ...

  4. [BZOJ1054][HAOI2008]移动玩具 bfs+hash

    1054: [HAOI2008]移动玩具 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2432  Solved: 1355[Submit][Stat ...

  5. 【BFS】bzoj1054 [HAOI2008]移动玩具

    暴搜吧,可以哈希一下,但是懒得写哈希了,所以慢得要死. Code: #include<cstdio> #include<queue> #include<set> # ...

  6. 【洛谷P4289】移动玩具 状压bfs

    代码如下 #include <bits/stdc++.h> using namespace std; const int dx[]={0,0,1,-1}; const int dy[]={ ...

  7. UVA 818 Cutting Chains(状压 + 暴搜)题解

    题意:有1~n个小环,他们中的有些互相扣在一起,问你至少切开几个能把这写小环串成一条链 思路:还是太菜了,题目给的n<=15,显然可以暴力解决. 用二进制表示每个环切还是不切,然后搜索所有情况. ...

  8. CF1042B 【Vitamins】(去重,状压搜索)

    由题意,我们其实会发现 对于每一种果汁,其对应的状态只有可能有7种 VA​ VB​ VC​ VA+VB​ VA+VC​ VB+VC​ VA+VB+VC 这道题就大大简化了 我们把所有果汁都读进来 每种 ...

  9. hdu4536-XCOM Enemy Unknown(爆搜)

    XCOM-Enemy Unknown是一款很好玩很经典的策略游戏. 在游戏中,由于未知的敌人--外星人入侵,你团结了世界各大国家进行抵抗.随着游戏进展,会有很多的外星人进攻事件.每次进攻外星人会选择3 ...

随机推荐

  1. Dubbo学习记录

    参考资料: 官网 Dubbo详细介绍与安装使用过程

  2. UIWebView中加载的网页尺寸太大,如何让网页适应屏幕大小 WebView加载HTML图片大小自适应与文章自动换行

    webview.scalesPageToFit = YES; http://www.cnblogs.com/yujidewu/p/5740934.html 若需要根据图片原本大小,宽度小于320px的 ...

  3. Django中URL的解析和反查

    add by zhj: 如果想用reverse(namespace1:namespace2:...:namespaceN:name)反查url(注意:用reverse('polls:index')方法 ...

  4. 《Java程序猿面试笔试宝典》之Java程序初始化的顺序是如何的

    在Java语言中.当实例化对象时.对象所在类的全部成员变量首先要进行初始化,仅仅有当全部类成员完毕初始化后,才会调用对象所在类的构造函数创建对象.    Java程序的初始化一般遵循以下三个原则(以下 ...

  5. EasyUI Easyloader 加载器

    用法 加载 EasyUI 模块 easyloader.base = '../'; // 设置 easyui 的基本目录 easyloader.load('messager', function(){ ...

  6. PAT 1138 Postorder Traversal [比较]

    1138 Postorder Traversal (25 分) Suppose that all the keys in a binary tree are distinct positive int ...

  7. 前端基础(html)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. Smarty小结提纲

    Smarty:模板技术 实现功能:前后分离. 原理:主要通过Smarty核心类实现,调用display方法,将模板文件读取,用正则进行替换,替换完保存到临时文件,将临时文件加载到当前页面. 配置文件( ...

  9. HDU5183 hash 表

    做题的时候忘了 数据结构老师说的hash表了, 用二分找,还好过了, hash 表 对这题 更快一些 #include <iostream> #include <algorithm& ...

  10. SQL: 查找空值

    ①用 IS NULL ②NULL 不能用 “=” 运算符 ③NULL 不支持加.减.乘.除.大小比较.相等比较 ④不同的函数对NULL的支持不一样,在遇到NULL时最好测试一下结果会受什么影响,不能仅 ...