Pro

Luogu3053

Sol

真的只是一个BFSBFSBFS!!!一个氧气都救不了的程序(快读+快写还TLETLETLE了一个点)

大体思路:对于每一种状态,我们枚举三个模块是否可以向左向右向上向下移动,如果可以移动,入队,继续搜索,队列中存整张图。处理方法:对于队列中的图,不需要每一个点都存储。在输入的时候,我们可以根据点之间的相对位置求出这个模块的形状,存起来,这样队列中只需要对每一个模块存一个位置就可以,我们把这个位置叫做模块的代表点,这样就能推出其他的位置。

关键的地方在于如何判断是否已经入过队。用集合配合类似哈希来处理,因为我们存储的只有三个点,六个值,第一感觉就是六维数组,然而六维数组会MLEMLEMLE。为什么呢?因为我们存储的不只是一个10×1010×1010×10的矩阵,而是30×3030×3030×30,我们也需要把看不到的地方存起来,这样的六维数组会变得很大,因此会MLEMLEMLE。

因为我们只是存了六个数,即三个模块的代表点的横纵坐标,所以就可以将这六个值哈希为一个六位数的值,放入集合,(突然想到这里好像可以用一位数组,请自行尝试)。

还需要两个很长很长的判断,一个是判断当前状态是否就是答案,另一个是每一个模块的每一个方向是否可以移动。这两个判断还是很好写的,不多说了。

Code

#include<iostream>
#include<cstdio>
#include<queue>
#include<set>
#include<cstring>
using namespace std;struct Node {int x , y;
};
Node shape[5][105] , sta[5];
struct Que {Node n[4];int cnt;Que(){};Que(Node nn1 , Node nn2 , Node nn3 , int ccnt) {n[1] = nn1 , n[2] = nn2 , n[3] = nn3 , cnt = ccnt;}
};
set<int>s;
queue<Que>q;
int n[4] , dx[4] = {0,0,-1,1} , dy[4] = {1,-1,0,0};
inline int mymin(int a , int b) { return a<b?a:b; }
inline int mymax(int a , int b) { return a>b?a:b; }void read(int &x)
{char c = getchar(); x = 0;while(c < '0' || c > '9') c = getchar();while(c <= '9' && c >= '0') x = x*10+c-48, c = getchar();
}void put(int x)
{  int num = 0; char c[15];while(x) c[++num] = (x%10)+48, x /= 10;while(num) putchar(c[num--]);putchar('\n');
}int jud(Que x) {int hin[4] , hax[4] , zin[4] , zax[4] , map[35][35];memset(map , 0 , sizeof(map));for(int i=1; i<=3; i++) {hin[i] = zin[i] = 0x3f;hax[i] = zax[i] = 0;        }for(int i=1; i<=3; i++)for(int j=1; j<=n[i]; j++) {int xx , yy;xx = x.n[i].x + shape[i][j].x;yy = x.n[i].y + shape[i][j].y;hin[i] = mymin(hin[i] , xx);hax[i] = mymax(hax[i] , xx);zin[i] = mymin(zin[i] , yy);zax[i] = mymax(zax[i] , yy);}for(int i=1; i<=3; i++)for(int j=zin[i]; j<=zax[i]; j++)for(int k=hin[i]; k<=hax[i]; k++) {if(map[j+10][k+10])return 0;map[j+10][k+10] = 1;    }return 1;
}int mov(int x , int d , Que t) {int map[35][35];memset(map , 0 , sizeof(map));for(int i=1; i<=3; i++) {if(i == x) {t.n[i].x += dx[d];t.n[i].y += dy[d];}for(int j=1; j<=n[i]; j++) {int xx , yy;xx = t.n[i].x + shape[i][j].x;yy = t.n[i].y + shape[i][j].y;if(map[xx+10][yy+10])return 0;map[xx+10][yy+10] = 1;}}return 1;
}void update(int &a , Que b) {a = b.n[1].x*100000+b.n[1].y*10000+b.n[2].x*1000+b.n[2].y*100+b.n[3].x*10+b.n[3].y;
}int main() {read(n[1]) , read(n[2]) , read(n[3]); for(int i=1; i<=3; i++) {Node a;read(a.x) , read(a.y);sta[i] = a;shape[i][1] = (Node){0,0};for(int j=2; j<=n[i]; j++) {int x , y;read(x) , read(y);shape[i][j] = (Node){x-a.x,y-a.y};}}q.push(Que(sta[1],sta[2],sta[3],0));s.insert(sta[1].x*100000+sta[1].y*10000+sta[2].x*1000+sta[2].y*100+sta[3].x*10+sta[3].y);while(!q.empty()) {Que u = q.front() , v;q.pop();if(jud(u)) {put(u.cnt);return 0;}u.cnt++;for(int i=0; i<4; i++)for(int j=1; j<=3; j++)if(mov(j,i,u)) {v = u;Node t;int m;t.x = v.n[j].x + dx[i];t.y = v.n[j].y + dy[i];v.n[j] = t;update(m,v);if(s.find(m)==s.end()) {s.insert(m);q.push(v);}}}printf("-1");return 0;
}

[USACO12OPEN]Unlocking Block【BFS / 广搜】相关推荐

  1. HDOJ-2614 Beat bfs广搜

    题目: Beat Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  2. BFS广搜解决迷宫问题java实现

    目录 1.例题 题目描述 输入 输出 测试数据 2. 思路分析 基本思想 具体步骤 代码实现 3.BFS小结 求解思路: 注意 1.例题 题目描述 迷宫由 n 行 m 列的单元格组成,每个单元格要么是 ...

  3. 2020 年百度之星·程序设计大赛 - 初赛一 Civilization BFS广搜

    problem Civilization Accepts: 619 Submissions: 2182 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...

  4. 抓住那头牛(BFS广搜)

    描述 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0≤N≤100000),牛位于点K(0≤K≤100000).农夫有两种移动方式: 1.从X移动到X-1或X+1,每次移动 ...

  5. 训练赛一:bfs广搜题目 CF115B Lawnmower

    CF115B Lawnmower time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  6. DFS深搜与BFS广搜专题

    一般搜索算法的流程框架 DFS和BFS与一般搜索流程的关系 如果一般搜索算法流程4使用的是stack栈结构(先进后出,后进先出)那么就会越搜越深.即,DFS,DFS只保存当前一条路径,其目的是枚举出所 ...

  7. 蓝桥杯 青蛙跳杯子【第八届】【省赛】【C组】 BFS 广搜

    资源限制 时间限制:1.0s   内存限制:256.0MB X星球的流行宠物是青蛙,一般有两种颜色:白色和黑色. X星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去. 如下图,有一排杯子, ...

  8. POJ 3669 Meteor Shower 流星雨 解题思路心得 BFS广搜 C/C++AC代码(另有TLE不知其因)

    原题 http://poj.org/problem?id=3669 题意 贝西(Bessie)听说即将发生一场异常的流星雨;有报道称这些流星将坠入大地并摧毁其所击中的任何东西,为安全着急,她发誓要找到 ...

  9. BFS广搜例题,问题引入 --- 阿狗荒岛逃生系列(其一)

    该例题来自我的学长,感谢学长们对我的带领: 例题简述: 代码及详细注释: #include<bits/stdc++.h> using namespace std; struct Node{ ...

最新文章

  1. windows 安装 spark 及 pycharm 调试 TopN 实例
  2. 几个关于噪声测量的实验
  3. CUBLAS_STATUS_ALLOC_FAILED CUDA_ERROR_OUT_OF_MEMORY
  4. Linux系统怎么挂载安卓手机,NFS挂载Android文件系统
  5. Windows静态库和动态库的调用方法汇总
  6. linux的wc命令源代码,linux下的wc命令的源代码
  7. 华为Mate X即将于本月上市:5G实测下载速率超1Gbps
  8. 拳王虚拟项目公社:闲鱼知乎引流售卖虚拟资源的虚拟兼职副业项目实操
  9. C#实现实时监控文件目录下的变化
  10. Sonar扫描python代码
  11. Kattis - missinggnomesD Missing Gnomes (思路题)
  12. 编译lua5.3.5报错:libreadline.so存在多处未定义的引用
  13. data 谷歌浏览器更改user 路径_安卓微信 7.0.13.2开启众测邀请,数据存储路径迁移...
  14. Nodejs express中创建ejs项目,解决express下默认创建jade,无法创建ejs问
  15. 利用FFT成功实现拓扑识别(五)--关于频谱泄露
  16. 不要和陌生人说话,消息中间件之 Topic
  17. 低延迟音频中的音频解码优化策略
  18. 到底买苹果XS还是XR_苹果xs和苹果xr内部相爱相杀:队友之间该如何选择?
  19. ATSHA204A加密芯片攻略——使用篇
  20. Java小白入门200例50之Java判断闰年并打印月份对应的天数

热门文章

  1. phpcms开启在线编辑模版 方法
  2. python去除读取文件中多余的空行
  3. Test: 为WLW添加源代码着色插件WindowsLiveWriter.CNBlogs.CodeHighlighter
  4. android res目录下存放图片文件夹 i m h xh xxh
  5. 0. Python3源码—编译
  6. git push本地代码到github出错
  7. 【风马一族_软件】微软卸载工具_msicuu2.exe
  8. 肤色检测一例-使用rgb颜色模型
  9. 推荐:安全公司的一些面试题
  10. Dynamips 7200