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 ...
随机推荐
- Windows SQL Server 2012 R2 安装Intel I217-V/I218-V网卡驱动(转)
1.下载Intel官方驱动: https://downloadcenter.intel.com/Detail_Desc.aspx?agr=Y&DwnldID=23071&lang=zh ...
- L10 PUtty+SSH 访问vncviewer
在Linux下配置一个VNC服务器,并设置2个用户,要求其中一个用户登录时不需要输入密码.然后在客户端使用ssh+vncview的方式访问. 安装tigervnc: 输入的密码是123456 连接服务 ...
- C语言预处理指令
C程序的源代码中可包括各种编译指令,这些指令称为预处理命令.虽然它们实际上不是C语言的一部分,但却扩展了C程序设计的环境.本节将介绍如何应用预处理程序和注释简化程序开发过程,并提高程序的可读性.ANS ...
- 【C#】开发可以可视化操作的windows服务
使用C#开发自定义windows服务是一件十分简单的事.那么什么时候,我们需要自己开发windows服务呢,就是当我们需要计算机定期或者一直执行我们开发的某些程序的时候.这里我以一个WCF的监听服务为 ...
- POJ 3279(Fliptile)题解
以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定长宽的黑白棋棋盘摆满棋子,每次操作可以反转一个位置和其上下左右共五个位置的棋子的颜色,求要使用最少翻转次数将所有棋子反转为黑 ...
- [ZT]图像处理库的比较:OpenCV,FreeImage,CImg,CxImage
1.对OpenCV 的印象:功能十分的强大,而且支持目前先进的图像处理技术,体系十分完善,操作手册很详细,手册首先给大家补计算机视觉的知识,几乎涵盖了近10年内的主流算法: 然后将图像格式和矩阵运算, ...
- 解决HTML5中placeholder属性兼容性的JQuery插件
//调用方法 $(function () { $(".pHolder").jason(); }); //HTML代码 <input type="text&quo ...
- ACID:数据库事务正确执行的四个基本要素
ACID,指数据库事务正确执行的四个基本要素的缩写.包含:原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持久性(Durability).一个支持事务(T ...
- IPTV小窗口播放视频 页面焦点无法移动的解决方法
在IPTV高清页面中,小窗口播放视频时,在某些机顶盒上(如高清中兴.高清大亚4904)会出现焦点无法移动现象,即按键无响应.被这个bug困扰了很久,虽然我知道解决方法,但只知其然,不知其所以然.今天做 ...
- 模拟app上商品详情点击图片放大并且可以切换大图
主要使用swiper插件,这里使用各小技巧,就是用两个swiper容器,点击一个小图容器,去让大图容器展示出来 小图容器 <div class="q_banner"> ...