bzoj1054: [HAOI2008]移动玩具 状压+爆搜即可
题意:在一个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]移动玩具 状压+爆搜即可的更多相关文章
- [HAOI2008]移动玩具 状压
发现自己只会打状压了. 233333 不需要考虑是否会被挡,所以直接dp #include<cstdio> #include<cstring> #include<iost ...
- 【Luogu】P4363一双木棋(状压爆搜)
题目链接 唉,只有AC了这道题才会感叹考场上没有想出解法的我是多么智障. 我甚至连任何想法都没有. 天啊我当时到底在想些什么. AC这道题我就能进前15了诶. 我们发现只要确定了轮廓线那么此时的状态就 ...
- bzoj1054: [HAOI2008]移动玩具
hash+bfs:要注意特殊情况.(似乎连sort.lower_bound都不用数据小直接判重了... #include<cstdio> #include<cstring> # ...
- [BZOJ1054][HAOI2008]移动玩具 bfs+hash
1054: [HAOI2008]移动玩具 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2432 Solved: 1355[Submit][Stat ...
- 【BFS】bzoj1054 [HAOI2008]移动玩具
暴搜吧,可以哈希一下,但是懒得写哈希了,所以慢得要死. Code: #include<cstdio> #include<queue> #include<set> # ...
- 【洛谷P4289】移动玩具 状压bfs
代码如下 #include <bits/stdc++.h> using namespace std; const int dx[]={0,0,1,-1}; const int dy[]={ ...
- UVA 818 Cutting Chains(状压 + 暴搜)题解
题意:有1~n个小环,他们中的有些互相扣在一起,问你至少切开几个能把这写小环串成一条链 思路:还是太菜了,题目给的n<=15,显然可以暴力解决. 用二进制表示每个环切还是不切,然后搜索所有情况. ...
- CF1042B 【Vitamins】(去重,状压搜索)
由题意,我们其实会发现 对于每一种果汁,其对应的状态只有可能有7种 VA VB VC VA+VB VA+VC VB+VC VA+VB+VC 这道题就大大简化了 我们把所有果汁都读进来 每种 ...
- hdu4536-XCOM Enemy Unknown(爆搜)
XCOM-Enemy Unknown是一款很好玩很经典的策略游戏. 在游戏中,由于未知的敌人--外星人入侵,你团结了世界各大国家进行抵抗.随着游戏进展,会有很多的外星人进攻事件.每次进攻外星人会选择3 ...
随机推荐
- [ASP.NET 大牛之路]03 - C#高级知识点概要(2) - 线程和并发
目录: 1.线程简单使用 2.并发和异步的区别 3.并发控制—锁 4.线程的通信机制 5.线程池中的线程 6.案例:支持并发的异步日志组件 7.结束 1.线程的简单使用---------------- ...
- poj3630 Phone List【Trie树】
Phone List Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 34805 Accepted: 9980 Descr ...
- "errmsg" : "distinct too big, 16mb cap",
repl_test:PRIMARY> show dbs admin 0.000GB direct_vote_resource 16.487GB local 14.860GB personas 3 ...
- Network---3694poj(桥与LCA)
题目链接 题意: 有n个电脑1-n,m个连接,由于可能存在一些桥,如果这些桥出现了问题,那么会导致一些电脑之间无法连接, 所以建立链接Q次,每次链接a和b电脑,求链接ab后还存在几个桥: 如果 ...
- vue.js(四)
由于组件内容太多又特别关键,我决定在官网教程的基础上,加上自己的理解,针对每个内容详细记录一下 1.注册组件 ①全局注册 //首先创建组件 Vue.component('blog-post', { ...
- java-信息安全(十八)java加密解密,签名等总结
一.基本概念 加密: 密码常用术语: 明文,密文,加密,加密算法,加密秘钥,解密,解密算法,解密秘钥, 密码分析:分析密文从而推断出明文或秘钥的过程 主动攻击:入侵密码系统,采用伪造,修改,删除等手段 ...
- WebService客户端几种实现方式
1.jdk原生调用(需要获取服务接口文件) import java.net.URL; import javax.xml.namespace.QName; import javax.xml.ws.Ser ...
- ScyllaDB - 基础部署
基础环境 操作系统: CentOS 7.2: 集群节点(虚拟机):172.16.134.15 ~ 17: 基础准备 安装依赖和卸载 abrt ( abrt 和 coredump 配置冲突 ): sud ...
- 5.2 Components — Defining A Component
一.概述 1. 为了定义一个组件,创建一个模板,它的名字以components/开头.为了定义一个新组件{{blog-post}},例如,创建一个components/blog-post模板. 2.注 ...
- Qt编译出错:“Cannot find file...... .pro."
刚接触Qt,使用Qt5.7时,出现如下编译错误: 其实原因很简单,就是Qt工程目录不能有“中文”.“全角符字符”[暂时发现这两种情况].