bzoj 1054 bfs
就是bfs,对于每个状态存一个hash为当前状态矩阵的二进制表示,然后搜就行了,写成双向bfs会快很多。
反思:对于C++的数组从0开始还不是特别习惯,经常犯错,对于C++的结构体不熟。
/**************************************************************
Problem: 1054
User: BLADEVIL
Language: C++
Result: Accepted
Time:112 ms
Memory:1940 kb
****************************************************************/ //By BLADEVIL
#include <cstdio>
#include <iostream>
#include <queue>
#include <set>
#define LL long long using namespace std; const int go[][]={{-,},{,},{,},{,-}}; struct rec
{
int map[][];
}; struct node
{
rec x;
int y;
node(rec xx,int yy):x(xx),y(yy){}
}; LL hash(rec x)
{
LL h=;
for (int i=;i<=;i++)
for (int j=;j<=;j++)
h^=(x.map[i][j]<<(*(i-)+(j-)));
return h;
} int main()
{
queue<node>que;
set<LL>bt;
rec start,finish;
for (int i=;i<=;i++)
{
char c[];
scanf("%s",&c);
for (int j=;j<;j++) start.map[i][j+]=(c[j]=='')?:;
}
for (int i=;i<=;i++)
{
char c[];
scanf("%s",&c);
for (int j=;j<;j++) finish.map[i][j+]=(c[j]=='')?:;
}
//printf("%lld %lld\n",hash(start),hash(finish));
if (hash(start)==hash(finish))
{
printf("0\n");
return ;
}
que.push(node(start,)); bt.insert(hash(start));
while (!que.empty())
{
node cur=que.front(); que.pop();
//printf("%lld ",hash(cur.x));
for (int i=;i<=;i++)
for (int j=;j<=;j++) if (cur.x.map[i][j])
for (int k=;k<;k++)
{
int x=i+go[k][],y=j+go[k][];
//printf("%d %d ",i,j);
//printf("%d %d |",x,y);
if ((!x)||(x>)||(!y)||(y>)) continue;
if (cur.x.map[x][y]) continue;
rec next=cur.x;
next.map[x][y]=next.map[i][j]--;
if (bt.count(hash(next))) continue;
que.push(node(next,cur.y+)); bt.insert(hash(next));
if (hash(finish)==hash(next))
{
printf("%d\n",cur.y+);
return ;
}
}
}
return ;
}
bzoj 1054 bfs的更多相关文章
- BZOJ 1054: [HAOI2008]移动玩具(bfs)
题面: https://www.lydsy.com/JudgeOnline/problem.php?id=1054 题解: 将每一种状态十六位压成二进制,然后bfs..不解释.. p.s.注意特判初始 ...
- bzoj 1054: [HAOI2008]移动玩具 bfs
1054: [HAOI2008]移动玩具 Time Limit: 10 Sec Memory Limit: 162 MB[Submit][Status][Discuss] Description 在 ...
- BZOJ 1054 题解
1054: [HAOI2008]移动玩具 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1888 Solved: 1035[Submit][Stat ...
- BZOJ 1054 广搜
1054: [HAOI2008]移动玩具 在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动 时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩 ...
- bzoj 1054 移动玩具
题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=1054 移动玩具 Description 在一个4*4的方框内摆放了若干个相同的玩具,某人想 ...
- BZOJ 1054 [HAOI2008]移动玩具
1054: [HAOI2008]移动玩具 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1388 Solved: 764[Submit][Statu ...
- [HAOI 2005][BZOJ 1054] 移动玩具
先贴一波题面 1054: [HAOI2008]移动玩具 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2288 Solved: 1270 Descr ...
- 【BZOJ 1054】 [HAOI2008]移动玩具
Description 在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移动 ...
- bzoj 2435 BFS
我们可以先将无根树变成有根树,随便选一个点当根就行了,我们选1,bfs求出来每个点 的size值,代表以它为根节点的子树中有多少个节点,(dfs可能会爆栈),然后再对于每一条 边算就好了 我tle了, ...
随机推荐
- 【.NET】- async await 异步编程
为什么需要异步,异步对可能起阻止作用的活动(例如,应用程序访问 Web 时)至关重要. 对 Web 资源的访问有时很慢或会延迟. 如果此类活动在同步过程中受阻,则整个应用程序必须等待. 在异步过程中, ...
- 修改CSV中的某些值
file.csv文件如下,然后对其中某些值进行变换操作,刚学Powershell的时候操作起来很麻烦,现在看来其实就是对于哈希表的操作. col1,col2,col3,col4 text1,text2 ...
- Redis集群分布(Windows版)
Redis系列 作者Mr.Chen,转载请注明博客出处:http://www.cnblogs.com/cjh-notes/ 第一步:下载安装redis windows版的下载地址:https://gi ...
- 【bzoj5089】最大连续子段和 分块+单调栈维护凸包
题目描述 给出一个长度为 n 的序列,要求支持如下两种操作: A l r x :将 [l,r] 区间内的所有数加上 x : Q l r : 询问 [l,r] 区间的最大连续子段和. 其中,一 ...
- openstack之neutron
Neutron neutron主要就是用于网络虚拟化,之前将nova的时候说过,网络部分没有写,因为openstack中的网络属于一个大部分,所以今天咱们就来看看neutron到底是怎么样实现网络虚拟 ...
- Hadoop——HDFS的构架
在使用一个工具之前,应该先对它的机制.组成等有深入的了解,以后才会更好的使用它.下面来介绍一下什么是HDFS,以及他的构架是什么样的. 1.什么是HDFS? Hadoop主要是用于进行大数据处理,那么 ...
- Hadoop运行Jar文件时Output错误
当第二次运行Jar程序时,出现Output文件已存在的Exception: Exception in thread "main" org.apache.hadoop.mapred. ...
- [Leetcode] Construct binary tree from inorder and postorder travesal 利用中序和后续遍历构造二叉树
Given inorder and postorder traversal of a tree, construct the binary tree. Note: You may assume th ...
- 51nod 1215 数组的宽度&poj 2796 Feel Good(单调栈)
单调栈求每个数在哪些区间是最值的经典操作. 把数一个一个丢进单调栈,弹出的时候[st[top-1]+1,i-1]这段区间就是弹出的数为最值的区间. poj2796 弹出的时候更新答案即可 #inclu ...
- hdu5652:India and China Origins(并查集)
倒序操作用并查集判断是否连通,新技能get√(其实以前就会了 这题细节很多...搞得整个程序都是调试输出,几度看不下去想要重写 并查集到现在大概掌握了两个基本用途:判断是否连通 / 路径压缩(上一篇b ...