【题目链接】

https://www.lydsy.com/JudgeOnline/problem.php?id=1054

【算法】

广度优先搜索

【代码】

#include<bits/stdc++.h>
using namespace std;
const int dx[] = {,,-,};
const int dy[] = {-,,,};
const int MAXS = << ; struct info
{
int mp[][];
int step;
} ; int i,j,k,goal,tx,ty,l,r,state;
int mp[][],g[][];
info q[MAXS];
info cur,tmp;
bool visited[MAXS]; inline bool valid(int x,int y)
{
return x > && x <= && y > && y <= ;
}
inline int get(int a[][])
{
int i,j,ret = ;
int b = ;
for (i = ; i <= ; i++)
{
for (j = ; j <= ; j++)
{
ret += a[i][j] * b;
b <<= ;
}
}
return ret;
} int main()
{ for (i = ; i <= ; i++)
{
for (j = ; j <= ; j++)
{
mp[i][j] = getchar() - '';
}
getchar();
}
getchar();
for (i = ; i <= ; i++)
{
for (j = ; j <= ; j++)
{
g[i][j] = getchar() - '';
}
getchar();
}
goal = get(g);
visited[get(mp)] = true;
if (visited[goal])
{
printf("0\n");
return ;
}
l = r = ;
memcpy(q[].mp,mp,sizeof(q[].mp));
q[].step = ;
while (l <= r)
{
cur = q[l];
l++;
for (i = ; i <= ; i++)
{
for (j = ; j <= ; j++)
{
if (cur.mp[i][j] == )
{
for (k = ; k < ; k++)
{
tx = i + dx[k];
ty = j + dy[k];
if (valid(tx,ty) && cur.mp[tx][ty] == )
{
swap(cur.mp[i][j],cur.mp[tx][ty]);
state = get(cur.mp);
if (!visited[state])
{
visited[state] = true;
if (state == goal)
{
printf("%d\n",cur.step+);
return ;
}
r++;
memcpy(q[r].mp,cur.mp,sizeof(q[r].mp));
q[r].step = cur.step + ;
}
swap(cur.mp[i][j],cur.mp[tx][ty]);
}
}
}
}
}
} return ; }

【HAOI 2008】 移动玩具的更多相关文章

  1. [BZOJ 1054][HAOI 2008]移动玩具 状态压缩

    考试的时候一看是河南省选题,觉得会很难,有点不敢想正解.感觉是个状压.但是一看是十年前的题,那怂什么! 直接把十六个数的状态压进去,因为个数是不变的,所以状态枚举的时候只要找数目一样的转移即可.而且只 ...

  2. [ HAOI 2008 ] 玩具取名

    \(\\\) \(Description\) 在一个只有\(W,I,N,G\)的字符集中,给出四个字符的若干映射,每个映射为一个字符映射到两个字符,现给你一个假定由一个字符经过多次映射产生的字符串,问 ...

  3. BZOJ 1010 (HNOI 2008) 玩具装箱

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MB Submit: 12665 Solved: 5540 [Submit][S ...

  4. [HAOI 2008]木棍分割

    Description 题库链接 有 \(n\) 根木棍,第 \(i\) 根木棍的长度为 \(L_i\) , \(n\) 根木棍依次连结了一起,总共有 \(n-1\) 个连接处.现在允许你最多砍断 \ ...

  5. [HAOI 2008]硬币购物

    Description 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请问每次有多少种付款方法. Input 第一 ...

  6. [HAOI 2008]糖果传递

    Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数nn<=1'000'000,表示小朋友的个 ...

  7. 【HAOI 2008】 硬币购物

    [题目链接] 点击打开链接 [算法] 此题是一道好题! 首先,我们发现 : 付款方法数 = 不受限制的方法数 - 受限制的方法数 那么,我们怎么求呢? 我们用dp求出不受限制的方法数(f[i]表示买i ...

  8. [ HAOI 2008 ] 圆上的整点

    \(\\\) Description 给出一个整数 \(r\) ,求圆 \(x^2+y^2=r^2\) 上的整点数. \(r\le 2\times 10^9\) \(\\\) Solution 神题. ...

  9. 【HAOI 2008】 糖果传递

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1045 [算法] 环形均分纸牌问题 [代码] #include<bits/std ...

随机推荐

  1. P1401 城市(30分,正解网络流)

    题目描述 N(2<=n<=200)个城市,M(1<=m<=40000)条无向边,你要找T(1<=T<=200)条从城市1到城市N的路,使得最长的边的长度最小,边不能 ...

  2. angular js shopping

    <!DOCTYPE html>   <html lang="en">   <head>   <meta charset="UTF ...

  3. [原创]Linux(CentOS)下安装nodejs+express

    网上找了很多步骤,各种问题,自己总结下吧 1.下载 wget --no-check-certificate https://nodejs.org/dist/v6.10.1/node-v6.10.1-l ...

  4. Android开发笔记(11)——DialogFragment & 点击监听

    转载请注明:http://www.cnblogs.com/igoslly/p/6931519.html DialogFragment使用 & 点击监听 /* DialogFragment是用于 ...

  5. C# 彻底关闭程序,包括循环

    System.Environment.Exit(System.Environment.ExitCode); this.Dispose(); this.Close();

  6. 西门子Step7中DB块结构导出

    Step7 通过变量表可以导出内存M地址和I,Q,T,C地址的变量,以及DB块的名称.怎么导出DB块的内部结构结构呢.即如何导出结构内的定义呢? 可以通过“选择某个DB块”,通过菜单命令“File&g ...

  7. sqlitManager

    @interface sqlitManager : NSObject +(instancetype)sharedSqlitManager; -(void)createDB; -(void)create ...

  8. Shell 环境变量也是变量

    跟定义普通变量一样,语法是 变量名=值,只不过这个名字叫 PATH,值是路径 shell PATH=/usr/local/python-2.7.6/bin 导入的话使用export命令 shell e ...

  9. Selenium3+python自动化 -JS处理滚动条

    selenium并不是万能的,有时候页面上操作无法实现的,这时候就需要借助JS来完成了. 常见场景: 当页面上的元素超过一屏后,想操作屏幕下方的元素,是不能直接定位到,会报元素不可见的. 这时候需要借 ...

  10. String去除重复字符两个方法

    package cn.aresoft; import java.util.ArrayList;import java.util.List; public class TestBasic { publi ...