【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的范围之内,每根木棍都连接着两个不同的小球,并且保 ...
随机推荐
- 怎样优雅的管理ActionBar
转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/50997095 本文出自:[顾林海的博客] 前言 随着项目越来越大.页面 ...
- mongo distinct 指定条件
db.Article.distinct("字段名称",{"Comment.Reply.email" : "xxx"})
- 第五课 Makefile文件的制作(补充)
序言: 前面的几节课讲解Makefile的一些基本知识也做了一些小例子实践了几下,那么到现在普通的练习则是没有问题.但是如果做项目文件较多又分层次等等还是会碰上好多问题的,这节课补充一些知识. 知识点 ...
- LeetCode:逆波兰表达式求值【150】
LeetCode:逆波兰表达式求值[150] 题目描述 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除 ...
- HihoCoder - 1339 Dice Possibility(概率dp)
题意:求用N(1<=N<=100)个骰子掷出M(1<=M<=600)的概率 分析:直接求概率可能出现6^100次方,会爆精度.可以用一个数组dp[i][j]记录用i个骰子掷出j ...
- iOS导入高德地图出现缺失armv7--"Undefined symbols for architecture armv7"
在已有项目中使用pod导入高德地图,报了以下错误: ld: warning: directory not found for option '-L/Users/paul/iOS/yun-hui-yi/ ...
- HTML5抽奖转盘
在线演示 本地下载
- C++中int转为char 以及int 转为string和string 转int和字符串的split
1.对于int 转为char 直接上代码: 正确做法: void toChar(int b) { char u; ]; _itoa( b, buffer, ); //正确解法一 u = buffer[ ...
- Python 类的设计原则
# 面向对象遵循的原则: SOLID # S(Single Responsibility Principle) # 单一职责原则 # 一个类只负责一项职责 # 好处 # 易于维护, 写出高内聚的代码 ...
- Spring_事务准备