就是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的更多相关文章

  1. BZOJ 1054: [HAOI2008]移动玩具(bfs)

    题面: https://www.lydsy.com/JudgeOnline/problem.php?id=1054 题解: 将每一种状态十六位压成二进制,然后bfs..不解释.. p.s.注意特判初始 ...

  2. bzoj 1054: [HAOI2008]移动玩具 bfs

    1054: [HAOI2008]移动玩具 Time Limit: 10 Sec  Memory Limit: 162 MB[Submit][Status][Discuss] Description 在 ...

  3. BZOJ 1054 题解

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

  4. BZOJ 1054 广搜

    1054: [HAOI2008]移动玩具 在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动 时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩 ...

  5. bzoj 1054 移动玩具

    题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=1054 移动玩具 Description 在一个4*4的方框内摆放了若干个相同的玩具,某人想 ...

  6. BZOJ 1054 [HAOI2008]移动玩具

    1054: [HAOI2008]移动玩具 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1388  Solved: 764[Submit][Statu ...

  7. [HAOI 2005][BZOJ 1054] 移动玩具

    先贴一波题面 1054: [HAOI2008]移动玩具 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2288  Solved: 1270 Descr ...

  8. 【BZOJ 1054】 [HAOI2008]移动玩具

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

  9. bzoj 2435 BFS

    我们可以先将无根树变成有根树,随便选一个点当根就行了,我们选1,bfs求出来每个点 的size值,代表以它为根节点的子树中有多少个节点,(dfs可能会爆栈),然后再对于每一条 边算就好了 我tle了, ...

随机推荐

  1. OSG学习:基本几何体绘制示例

    绘制并渲染几何体主要有如下3大步骤: 1.创建各种向量数据,如顶点.纹理坐标.颜色和法线等.需要注意的是,添加顶点数据时主要按照逆时针顺序添加, 以确保背面剔除的正确. 2.实例化一个几何体对象(os ...

  2. asp.net中Repeater结合js实现checkbox的全选/全不选

    前台界面代码: <input name="CheckAll" type="checkbox" id="CheckAll" value= ...

  3. PAT L2-028 秀恩爱分得快

    https://pintia.cn/problem-sets/994805046380707840/problems/994805054698012672 古人云:秀恩爱,分得快. 互联网上每天都有大 ...

  4. 在线api查询网站

    1.包含各种常用的语言 http://tool.oschina.net/apidocs

  5. 刚装的vs无法运行正确的程序

  6. 第69天:jQuery入口函数

    一.jQuery入口函数 1.$(document).ready(function(){}); 2.$(function(){}); 二.事件处理程序  1.事件源 Js方式:document.get ...

  7. C#操作access练习

    ORM框架使用dapper,dapper不仅能操作sqlserver,也能操作access,下面为基本代码: OleDbConnection strConnection = new OleDbConn ...

  8. [WC2008]游览计划 状压DP,斯坦纳树

    ---题面--- 题解: 这是一道斯坦纳树的题,用状压+spfa来解决 什么是斯坦纳树? 一开始还以为是数据结构来着,其实跟最小生成树很像,大致就是最小生成树只能在各个点之间直接相连,而斯坦纳树则允许 ...

  9. 专题训练之AC自动机

    推荐博客:http://www.cnblogs.com/kuangbin/p/3164106.html AC自动机小结 https://blog.csdn.net/creatorx/article/d ...

  10. printf函数用法小记

    By francis_hao    Aug 26,2017   C语言中printf函数是一个比较常用的函数,但是常用并不代表完全了解,本文翻译了printf的man手册,介绍了其全部功能(不包括ma ...