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 ...
随机推荐
- 开发环境配置--Ubuntu+Qt4+OpenCV(三)
同系列文章 1. 开发环境配置--Ubuntu+Qt4+OpenCV(一) 2. 开发环境配置--Ubuntu+Qt4+OpenCV(二) 3. 开发环境配置--Ubuntu+Qt4+OpenCV(三 ...
- In Depth : Android Shutdown Sequence
What happened when I long press power button ?What is shutdown sequence ?How is it different from de ...
- debian install & configure(2)-drivers-nvidia
==========================================手动编译卸载受限驱动 :apt-get --purge remove nvidia-*apt-get --purge ...
- linux日志(常用命令)
LinuxIDERedHat防火墙活动 cat tail -f 日 志 文 件 说 明 /var/log/message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志 ...
- 5款免费Windows远程连接Linux桌面软件(VNC客户端)
不论我们出于何种的用途目的,很多朋友有需要用到VNC链接Linux桌面环境,之前老左有分享过VNC Viewer绿色软件,昨天有朋友提出来使用之后登录远程桌面的界面.分辨率等有些色差.流畅程度 ...
- Jdt Javax
http://www.javablogging.com/dynamic-in-memory-compilation/ http://www.java2s.com/Code/Java/JDK-6/Com ...
- 元素“Button”不是已知元素。原因可能是网站中存在编译错误,或者缺少web.config文件
最近开发的时候ASP控件都有波浪下划线,提示不是已知元素,搞得挺郁闷的.虽然不影响变异,不过就是不爽. 折腾N久...... 解决了,把FramWork平台换成3.5,问题解决,不知道为啥,求大神指点 ...
- 学javascript突发奇想,只用浏览器就能转换进制
只需要三行就可以了 具体代码如下 <script> document.write(new Number(8).toString(2));//toSting方法可以转换任何进制 </s ...
- 错误:C:\Windows\System32\ssleay32.dll: Can't load IA 32-bit .dll on a AMD 64-bit
错误:C:\Windows\System32\ssleay32.dll: Can't load IA 32-bit .dll on a AMD 64-bit 错误的原因是:jdk不是64位的,而是32 ...
- UVALive 3635 Pie 切糕大师 二分
题意:为每个小伙伴切糕,要求每个小盆友(包括你自己)分得的pie一样大,但是每个人只能分得一份pie,不能拿两份凑一起的. 做法:二分查找切糕的大小,然后看看分出来的个数有没有大于小盆友们的个数,它又 ...