uvalive 6888 Ricochet Robots bfs
给一个n*m的图, 图上有n个标号, n<=4, 然后有墙, 还有一个终点x。 每一步, 只能走某一个标号, 可以向四个方向走, 然后必须要碰到墙或者图的边界或者另一个标号才能停下来。 问你在t步之内能否使第一个标号到达终点。
因为有一个上限t。 所以直接bfs就可以, 感觉思路不是很难, 但是写代码+调试花了超级久...不过总算1A, 不然就懵逼了。
#include <bits/stdc++.h> using namespace std;
#define pb(x) push_back(x)
#define ll long long
#define mk(x, y) make_pair(x, y)
#define lson l, m, rt<<1
#define mem(a) memset(a, 0, sizeof(a))
#define rson m+1, r, rt<<11
#define mem1(a) memset(a, -1, sizeof(a))
#define mem2(a) memset(a, 0x3f, sizeof(a))
#define rep(i, n, a) for(int i = a; i<n; i++)
#define fi first
#define se second
typedef pair<int, int> pll;
const double PI = acos(-1.0);
const double eps = 1e-;
const int mod = ;
const int inf = ;
const int dir[][] = { {-, }, {, }, {, -}, {, } };
struct node
{
vector<pll> a;
int step;
node() {
step = ;
}
};
int cnt, w, h;
map <vector<pll>, int> mp;
vector <int> row[], col[];
pll target;
char s[][];
int bfs(const node& init, int t)
{
queue <node> q;
q.push(init);
while(!q.empty()) {
node tmp = q.front(); q.pop();
if(tmp.step > t)
continue;
if(tmp.a[] == target) {
return tmp.step;
}
for(int i = ; i < cnt; i++) {
int x = tmp.a[i].fi, y = tmp.a[i].se;
int tmpy = *(--lower_bound(row[x].begin(), row[x].end(), y));
for(int j = ; j < cnt; j++) {
if(i == j)
continue;
if(tmp.a[i].fi == tmp.a[j].fi && tmp.a[i].se > tmp.a[j].se) {
tmpy = max(tmpy, tmp.a[j].se);
}
}
tmpy++;
vector<pll> ha(tmp.a);
ha[i].se = tmpy;
if(!mp[ha]) {
node newNode = tmp;
newNode.a[i].se = tmpy;
newNode.step++;
q.push(newNode);
mp[ha] = ;
} x = tmp.a[i].fi, y = tmp.a[i].se;
tmpy = *lower_bound(row[x].begin(), row[x].end(), y);
for(int j = ; j < cnt; j++) {
if(i == j)
continue;
if(tmp.a[i].fi == tmp.a[j].fi && tmp.a[i].se < tmp.a[j].se) {
tmpy = min(tmpy, tmp.a[j].se);
}
}
tmpy--;
ha = tmp.a;
ha[i].se = tmpy;
if(!mp[ha]) {
node newNode = tmp;
newNode.a[i].se = tmpy;
newNode.step++;
mp[ha] = ;
q.push(newNode);
} x = tmp.a[i].fi, y = tmp.a[i].se;
int tmpx = *(--lower_bound(col[y].begin(), col[y].end(), x));
for(int j = ; j < cnt; j++) {
if(i == j)
continue;
if(tmp.a[i].se == tmp.a[j].se && tmp.a[i].fi > tmp.a[j].fi) {
tmpx = max(tmpx, tmp.a[j].fi);
}
}
tmpx++;
ha = tmp.a;
ha[i].fi = tmpx;
if(!mp[ha]) {
node newNode = tmp;
newNode.a[i].fi = tmpx;
newNode.step++;
q.push(newNode);
mp[ha] = ;
}
x = tmp.a[i].fi, y = tmp.a[i].se;
tmpx = *lower_bound(col[y].begin(), col[y].end(), x);
for(int j = ; j < cnt; j++) {
if(i == j)
continue;
if(tmp.a[i].se == tmp.a[j].se && tmp.a[i].fi < tmp.a[j].fi) {
tmpx = min(tmpx, tmp.a[j].fi);
}
}
tmpx--;
ha = tmp.a;
ha[i].fi = tmpx;
if(!mp[ha]) {
node newNode = tmp;
newNode.a[i].fi = tmpx;
newNode.step++;
q.push(newNode);
mp[ha] = ;
}
}
}
return -;
}
int main()
{
int t;
while(cin>>cnt>>w>>h>>t) {
mp.clear();
for(int i = ; i < h; i++) {
scanf("%s", s[i]);
}
for(int i = ; i < h; i++) {
row[i].clear();
row[i].pb(-);
row[i].pb(w);
}
for(int i = ; i < w; i++) {
col[i].clear();
col[i].pb(-);
col[i].pb(h);
}
node init;
for(int i = ; i < h; i++) {
for(int j = ; j < w; j++) {
if(s[i][j] == 'X')
target = mk(i, j);
if(s[i][j] == 'W') {
row[i].pb(j);
col[j].pb(i);
}
}
}
for(int i = ; i <= cnt; i++) {
for(int j = ; j < h; j++) {
for(int k = ; k < w; k++) {
if(s[j][k]-'' == i) {
init.a.pb(mk(j, k));
}
}
}
}
for(int i = ; i < h; i++) {
sort(row[i].begin(), row[i].end());
}
for(int i = ; i < w; i++)
sort(col[i].begin(), col[i].end());
mp[init.a] = ;
int ans = bfs(init, t);
if(ans == -) {
puts("NO SOLUTION");
} else {
cout<<ans<<endl;
}
}
}
uvalive 6888 Ricochet Robots bfs的更多相关文章
- UVALive 5066 Fire Drill BFS+背包
H - Fire Drill Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Sta ...
- UVALive 4025 Color Squares(BFS)
题目链接:UVALive 4025 Color Squares 按题意要求放带有颜色的块,求达到w分的最少步数. //yy:哇,看别人存下整个棋盘的状态来做,我什么都不想说了,不知道下午自己写了些什么 ...
- UVALive 5066 Fire Drill --BFS+DP
题意:有一个三维的地图,有n个人被困住,现在消防队员只能从1楼的一个入口进入,营救被困者,每一个被困者有一个价值,当消防队员找到一个被困者之后,他可以营救或者见死不救,如果救的话,他必须马上将其背到入 ...
- Robots on a grid(DP+bfs())
链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=25585 Current Server Time: 2013-08-27 20:42:26 Ro ...
- What a Ridiculous Election UVALive - 7672 (BFS)
题目链接: E - What a Ridiculous Election UVALive - 7672 题目大意: 12345 可以经过若干次操作转换为其它五位数. 操作分三种,分别为: 操作1:交 ...
- UVALive 6665 Dragonâs Cruller --BFS,类八数码问题
题意大概就是八数码问题,只不过把空格的移动方式改变了:空格能够向前或向后移动一格或三格(循环的). 分析:其实跟八数码问题差不多,用康托展开记录状态,bfs即可. 代码: #include <i ...
- UVALive 7297 bfs
题意 一个小偷偷到了项链 他想知道自己是否可以逃出去 地图中有一个小偷 一个警察 警察有一条狗 一开始 小偷和警察的移动速度都是1 当警察走到小偷经过过的地方时 警察会有一条狗嗅到小偷的气味并且以2的 ...
- UVALive 7297 Hounded by Indecision BFS
题目链接:Hounded by Indecision 题意:map中给出小偷的位置,警察的位置.警察有一只狗,开始的时候警察和狗一起行动,也就是看做一个格子,当警察遇见小偷走过的格子时,狗就会嗅到它的 ...
- UVALive 3956 Key Task (bfs+状态压缩)
Key Task 题目链接: http://acm.hust.edu.cn/vjudge/contest/129733#problem/D Description The Czech Technica ...
随机推荐
- .net通用权限框架B/S(一)
一直做软件实施,用过一些二次开发平台,最近看了一些大神写的框架,于是参考写了一个B/S通用权限框架,项目使用MVC4+EF5+EASYUI(.net framework4),开发环境vs2010+sq ...
- ASP.NET中的路径(path) 详解
一 ASP.NET常用路径(path)获取方法与格式对照表 假设我们的网址为http://localhost:1897/ News/Press/Content.aspx?id=1019 跟 Brows ...
- Android之Socket通信(一)
一.服务器端,运行在PC机上 import java.io.*; import java.net.*; public class SimpleServer{ public static voi ...
- Django模型-数据库操作
前言 前边记录的URLconf和Django模板全都是介绍页面展示的东西,也就是表现层的内容.由于Python先天具备简单而强大的数据库查询执行方法,Django 非常适合开发数据库驱动网站. 这篇开 ...
- Oracle EBS-SQL (PO-2):检查当月到货补单的记录数.sql
SELECT DECODE(PLLA.FROM_LINE_ID,'-1','手工','','自动创建') 下达方式, rsh.receipt_num ...
- Oracle EBS-SQL (MRP-2):检查期间主计划录入记录数.sql
SELECT FU.description 创建者, MSD.CREATION_DATE 创建日期, ...
- android应用开发全程实录-你有多熟悉listview
http://blog.csdn.net/notice520/article/details/7040962 今天给大家带来<android应用开发全程实录>中关于listview和ada ...
- 修改Windows XP的桌面路径
WinowsXP 的桌面的是在系统盘上,一但系统瘫痪需要重新安装系统时,总得记得去备份桌面的重要文件,如果一不小心忘记备份就重装系统的话,那些重要文件就一去不复返了.其实我们可以把桌面放到其它盘目录里 ...
- WPF按钮清空自带样式,以及透明按钮时,Grid的Background属性设置引起"点击"问题.
1.空样式按钮 <Style x:Key="EmptyButtonStyle" TargetType="Button"> &l ...
- iOS 圆角那些事(转)
似乎没有那家公司比Apple更爱圆角了,事实上,圆角也会让图形/产品看起来更加无侵略性,能够带来更好的用户体验.iOS开发中各种圆角也随处可见,最简单给控件添加圆角的方式就是给视图的layer设置co ...