【lightoj-1055】Going Together(BFS)
链接:http://www.lightoj.com/volume_showproblem.php?problem=1055
类似推箱子的游戏,一条命令可以让abc三个小人同时移动,但是出界或者撞墙是不移动的,求abc到达终点x所需要的最小步数。
我这里用六维的vis来标记这个点走过没,直接上代码
- #include<bits/stdc++.h>
- using namespace std;
- int n;
- char mp[][];
- bool vis[][][][][][];
- struct node
- {
- int ax, ay, bx, by, cx, cy, step;
- };
- node s;
- int bfs()
- {
- int nx[][] = {, , , , , -, -, };
- queue<node>Q;
- s.step = ;
- Q.push(s);
- while(!Q.empty())
- {
- s = Q.front();
- Q.pop();
- if(mp[s.ax][s.ay]=='X'&&mp[s.bx][s.by]=='X'&&mp[s.cx][s.cy]=='X') return s.step;
- for(int i = ; i < ; i++)
- {
- node t;
- t.ax = s.ax + nx[i][], t.bx = s.bx + nx[i][], t.cx = s.cx + nx[i][];
- t.ay = s.ay + nx[i][], t.by = s.by + nx[i][], t.cy = s.cy + nx[i][];
- if(t.ax<||t.ax>=n) t.ax = s.ax;
- if(t.ay<||t.ay>=n) t.ay = s.ay;
- if(t.bx<||t.bx>=n) t.bx = s.bx;
- if(t.by<||t.by>=n) t.by = s.by;
- if(t.cx<||t.cx>=n) t.cx = s.cx;
- if(t.cy<||t.cy>=n) t.cy = s.cy;
- for(int j = ; j <= ; j++) //这里循环3是因为不能让3个小人重合,若循环1次因为走位的次序不同可能还会重合
- {
- if(mp[t.ax][t.ay]=='#'||(t.ax==t.bx&&t.ay==t.by)||(t.ax==t.cx&&t.ay==t.cy)) t.ax=s.ax, t.ay=s.ay;
- if(mp[t.bx][t.by]=='#'||(t.bx==t.ax&&t.by==t.ay)||(t.bx==t.cx&&t.by==t.cy)) t.bx=s.bx, t.by=s.by;
- if(mp[t.cx][t.cy]=='#'||(t.cx==t.bx&&t.cy==t.by)||(t.cx==t.ax&&t.cy==t.ay)) t.cx=s.cx, t.cy=s.cy;
- }
- if(vis[t.ax][t.ay][t.bx][t.by][t.cx][t.cy]) continue;
- vis[t.ax][t.ay][t.bx][t.by][t.cx][t.cy] = ;
- t.step = s.step+;
- Q.push(t);
- }
- }
- return -;
- }
- int main()
- {
- int cas = , t;
- cin>>t;
- while(t--)
- {
- scanf("%d", &n);
- memset(vis, , sizeof vis);
- for(int i = ; i < n; i++)
- scanf("%s", mp[i]);
- for(int i = ; i < n; i++)
- for(int j = ; j < n; j++)
- {
- if(mp[i][j] == 'A')
- s.ax = i, s.ay = j;
- if(mp[i][j] == 'B')
- s.bx = i, s.by = j;
- if(mp[i][j] == 'C')
- s.cx = i, s.cy = j;
- }
- vis[s.ax][s.ay][s.bx][s.by][s.cx][s.cy] = ;
- printf("Case %d: ", ++cas);
- int ans = bfs();
- if(ans==-) puts("trapped");
- else printf("%d\n", ans);
- }
- return ;
- }
【lightoj-1055】Going Together(BFS)的更多相关文章
- 【LightOJ - 1205】Palindromic Numbers
[链接]https://cn.vjudge.net/problem/LightOJ-1205 [题意] 求出L..R范围内的回文个数 [题解] 数位DP; 先求出1..x里面的回文串个数.则做一下前缀 ...
- 【BZOJ 3049】【USACO2013 Jan】Island Travels BFS+状压DP
这是今天下午的互测题,只得了60多分 分析一下错因: $dis[i][j]$只记录了相邻的两个岛屿之间的距离,我一开始以为可以,后来$charge$提醒我有可能会出现来回走的情况,而状压转移就一次,无 ...
- 【POJ - 3414】Pots(bfs)
Pots 直接上中文 Descriptions: 给你两个容器,分别能装下A升水和B升水,并且可以进行以下操作 FILL(i) 将第i个容器从水龙头里装满(1 ≤ i ≤ 2); DRO ...
- 【HDU - 3085】Nightmare Ⅱ(bfs)
-->Nightmare Ⅱ 原题太复杂,直接简单的讲中文吧 Descriptions: X表示墙 .表示路 M,G表示两个人 Z表示鬼 M要去找G但是有两个鬼(Z)会阻碍他们,每一轮都是M和G ...
- 【HDU - 3533】Escape(bfs)
Escape Descriptions: 一个人从(0,0)跑到(n,m),只有k点能量,一秒消耗一点,在图中有k个炮塔,给出炮塔的射击方向c,射击间隔t,子弹速度v,坐标x,y问这个人能不能安全到 ...
- 【Aizu - 0558】Cheese(bfs)
-->Cheese 原文是日语,这里就写中文了 Descriptions: 在H * W的地图上有N个奶酪工厂,每个工厂分别生产硬度为1-N的奶酪.有一只老鼠准备从出发点吃遍每一个工厂的奶酪.老 ...
- 【LightOJ 1422】Halloween Costumes(区间DP)
题 题意 告诉我们每天要穿第几号衣服,规定可以套好多衣服,所以每天可以套上一件新的该号衣服,也可以脱掉一直到该号衣服在最外面.求最少需要几件衣服. 分析 DP,dp[i][j]表示第i天到第j天不脱第 ...
- 【LightOJ 1136】Division by 3(简单数学)
BUPT2017 wintertraining(16) #5 C HDU - 1021 题意 1, 12, 123, 1234, ..., 12345678910, ... 问第a到第b个数(incl ...
- 【LightOJ 1081】Square Queries(二维RMQ降维)
Little Tommy is playing a game. The game is played on a 2D N x N grid. There is an integer in each c ...
- 【HIHOCODER 1055】 刷油漆(树上背包)
描述 小Ho有着一棵灰常好玩的树玩具!这棵树玩具是由N个小球和N-1根木棍拼凑而成,这N个小球都被小Ho标上了不同的数字,并且这些数字都是处于1..N的范围之内,每根木棍都连接着两个不同的小球,并且保 ...
随机推荐
- python列表套字典数据类型转换
1.题目 list3 = [ {'name':'Alex','hobby':'抽烟'}, {'name':'Alex', 'hobby':'喝酒'}, {'name':'Alex', 'hobby': ...
- 我的Android进阶之旅------>解决Jackson等第三方转换Json的开发包在开启混淆后转换的实体类数据都是null的bug
1.错误描述 今天测试人员提了一个bug,说使用我们的app出现了闪退的bug,后来通过debug断点调试,发现我们的app转换服务器发送过来的json数据后,都是为null.而之前已经提测快一个月的 ...
- MySQL数据库(3)- 完整性约束、外键的变种、单表查询
一.完整性约束 在创建表时候,约束条件和数据类型的宽度都是可选参数. 作用:用于保证数据的完整性和一致性. 1.not null(不可空)与default 示例一:插入一个空值,如下: mysql&g ...
- Python高级教程-切片
Python中的切片 取一个list或tuple的部分元素是非常常见的操作.比如,一个list如下: >>> L = ['A','B','C','D'] 对经常取指定索引范围的操作, ...
- Hadoop源码如何查看
如何查看hadoop源码 1解压hadoop安装压缩文件成为文件夹,再进入解压后的文件夹下的src文件夹,选中core,hdfs,mapred三个文件夹
- C++中的默认成员函数
一般而言,对于一个用户自定义的类类型,以下四个函数在用户没有自定义的情形下,会由编译器自动生成: 1.default constructor 2.copy constructor Someclass: ...
- day2 笔记
while 条件: # 循环体 # 如果条件为真,那么循环体则执行 # 如果条件为假,那么循环体不执行 循环中止语句 如果在循环的过程中,因为某 ...
- Node.js API学习笔记(二)
本文发表于本人博客. 上一节笔记说到创建Buffer实例,这节继续讲Buffer.本节讲解下Buffer的一些静态方法.写入以及读取方法. Buffer.isEncoding(编码)判断nodejs是 ...
- .net:上传图片并将保存至指定目录下(支持PC端和移动端)
页面: <body> <form id="formid" name="myform" action="Upload" me ...
- cf100989b
http://codeforces.com/gym/100989/my B. LCS (B) time limit per test 0.25 seconds memory limit per tes ...