题目大意:走迷宫,遇到墙时可以推着墙走,但墙后还是墙时便不能推。求出一条任意的最短路径。

题目分析:这道题出的比较人性,输入的时候便是将四周的墙用二进制数表示好了,其实这样减轻了做题人的负担。IDA*,当到最近的一个出口的距离加上当前层数cur都比maxd大时,则剪枝。不过,值得注意的是:当推着墙走的时候,涉及到3个格子周围的墙的变化(在边界除外)。

代码如下:

# include<iostream>
# include<cstdio>
# include<cmath>
# include<vector>
# include<cstring>
# include<algorithm>
using namespace std; struct XY
{
int x,y;
XY(int _x,int _y):x(_x),y(_y){}
};
vector<XY>xy;
int mp[4][6],sx,sy;
int d[4][2]={{0,-1},{-1,0},{0,1},{1,0}};
int dd[4]={2,3,0,1};
string pd="WNES",ans; void f()
{
xy.clear();
for(int i=0;i<6;++i){
if((mp[0][i]&2)==0)
xy.push_back(XY(0,i));
if((mp[3][i]&8)==0)
xy.push_back(XY(3,i));
}
for(int i=0;i<4;++i){
if((mp[i][0]&1)==0)
xy.push_back(XY(i,0));
if((mp[i][5]&4)==0)
xy.push_back(XY(i,5));
}
} bool dfs(int cur,int maxd,int x,int y,string path)
{
if(cur==maxd){
if(x==0&&((mp[x][y]&2)==0)){
ans=path+'N';
return true;
}
if(x==3&&((mp[x][y]&8)==0)){
ans=path+'S';
return true;
}
if(y==0&&((mp[x][y]&1)==0)){
ans=path+'W';
return true;
}
if(y==5&&((mp[x][y]&4)==0)){
ans=path+'E';
return true;
}
return false;
} f();
int minn=10000,l=xy.size();
for(int i=0;i<l;++i)
minn=min(minn,abs(x-xy[i].x)+abs(y-xy[i].y));
if(cur+minn>maxd)
return false; for(int i=0;i<4;++i){
int nx=x+d[i][0],ny=y+d[i][1];
if(nx<0||nx>3||ny<0||ny>5)
continue;
if(mp[x][y]&(1<<i)){
if(mp[nx][ny]&(1<<i))
continue;
mp[x][y]^=(1<<i);
mp[nx][ny]^=(1<<dd[i]);
mp[nx][ny]^=(1<<i);
int nnx=nx+d[i][0],nny=ny+d[i][1];
if(nnx>=0&&nnx<4&&nny>=0&&nny<6)
mp[nnx][nny]^=(1<<dd[i]);
if(dfs(cur+1,maxd,nx,ny,path+pd[i]))
return true;
mp[nx][ny]^=(1<<i);
mp[nx][ny]^=(1<<dd[i]);
mp[x][y]^=(1<<i);
if(nnx>=0&&nnx<4&&nny>=0&&nny<6)
mp[nnx][nny]^=(1<<dd[i]);
}else{
if(dfs(cur+1,maxd,nx,ny,path+pd[i]))
return true;
}
}
return false;
} int main()
{
//freopen("UVA-10384 The Wall Pushers.txt","r",stdin);
while(scanf("%d%d",&sy,&sx)&&(sx+sy))
{
--sx,--sy;
for(int i=0;i<4;++i)
for(int j=0;j<6;++j)
scanf("%d",&mp[i][j]);
for(int maxd=0;;++maxd){
if(dfs(0,maxd,sx,sy,"")){
cout<<ans<<endl;
break;
}
}
}
return 0;
}

  

UVA-10384 The Wall Pushers (IDA*)的更多相关文章

  1. UVA - 10384 The Wall Pusher(推门游戏)(IDA*)

    题意:从起点出发,可向东南西北4个方向走,如果前面没有墙则可走:如果前面只有一堵墙,则可将墙向前推一格,其余情况不可推动,且不能推动游戏区域边界上的墙.问走出迷宫的最少步数,输出任意一个移动序列. 分 ...

  2. UVa 10384 - The Wall Pushers

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  3. 【UVa】1374 Power Calculus(IDA*)

    题目 题目     分析 IDA*大法好,抄了lrj代码.     代码 #include <cstdio> #include <cstring> #include <a ...

  4. uva 1153 顾客是上帝(贪心)

    uva 1153 顾客是上帝(贪心) 有n个工作,已知每个工作需要的时间q[i]和截止时间d[i](必须在此前完成),最多能完成多少个工作?工作只能串行完成,第一项任务开始的时间不早于时刻0. 这道题 ...

  5. UVA10384-The Wall Pushers(迭代加深搜索)

    Problem UVA10384-The Wall Pushers Accept: 199   Submit: 1546Time Limit: 10000 mSec Problem Descripti ...

  6. Booksort POJ - 3460 (IDA*)

    Description The Leiden University Library has millions of books. When a student wants to borrow a ce ...

  7. 人类即将进入互联网梦境时代(IDA)

    在电影<盗梦空间>中,男主角科布和妻子在梦境中生活了50年,从楼宇.商铺.到河流浅滩.一草一木.这两位造梦师用意念建造了属于自己的梦境空间.你或许并不会想到,在不久未来,这看似科幻的情节将 ...

  8. UVA 1479 Graph and Queries (Treap)

    题意: 给一个无向图,再给一系列操作(以下3种),输出最后的平均查询结果. (1)D X 删除第x条边. (2)Q X k  查询与点X相连的连通分量中第k大的点的权值. (3)C X v  将点X的 ...

  9. UVa 210 并行程序模拟(deque)

    题意: 模拟n个程序运行 格式一共有5种:var = constant(赋值):print var(打印):lock:unlock:end, 上述5种语句分别需要t1.t2.t3.t4.t5单位时间 ...

随机推荐

  1. 利用Python分析GP服务运行结果的输出路径 & 实现服务输出路径的本地化 分类: Python ArcGIS for desktop ArcGIS for server 2015-08-06 19:49 3人阅读 评论(0) 收藏

    最近,一直纠结一个问题:做好的GP模型或者脚本在本地运行,一切正常:发布为GP服务以后时而可以运行成功,而更多的是运行失败,甚至不能知晓运行成功后的结果输出在哪里. 铺天盖地的文档告诉我,如下信息: ...

  2. CF734F Anton and School 构造+数论

    正解:构造 解题报告: 先放下传送门QwQ 这题首先要知道一个结论:(x&y)+(x|y)=x+y 还是能理解的趴? 所以我们把bi+ci就能得到∑a+n*a[i] 然后我们就能成功求出∑a ...

  3. 数据网格和树-EasyUI Datagrid 数据网格、EasyUI Propertygrid 属性网格、EasyUI Tree 树、EasyUI Treegrid 树形网格

    EasyUI Datagrid 数据网格 扩展自 $.fn.panel.defaults.通过 $.fn.datagrid.defaults 重写默认的 defaults. 数据网格(datagrid ...

  4. [py]class的特殊方法

    类方法 解释 hasattr hasattr(class) getattr - setattr - delattr - - - __getattr__ __setattr__ __delattr__ ...

  5. [py][lc]python高阶函数(匿名/map/reduce/sorted)

    匿名函数 - 传入列表 f = lambda x: x[2] print(f([1, 2, 3])) # x = [1,2,3] map使用 传入函数体 def f(x): return x*x r ...

  6. PAT 1075 PAT Judge[比较]

    1075 PAT Judge (25 分) The ranklist of PAT is generated from the status list, which shows the scores ...

  7. MessageBox.show显示窗口在最上层

    C#中使用MessageBox.Show();有时候会被主窗口挡住而看不到.使用如下语句则可以使其显示在最上层. MessageBox.Show("MessageBox显示窗口在最上层了吗? ...

  8. 两个栈实现队列&两个栈实现队列

    为说明思想,假设队列.栈都很大,不会出现满的情况. 1. 两个栈实现队列 //前提已知: struct Stack { int top; //栈顶指针 int stacksize;//栈的大小 int ...

  9. OA项目_环境搭建

    OA项目现在要做成微服务,用的框架是springboot,所用的编程工具是idea,maven,做为一个程序员最关心的就是我需要在那个架包中编写代码,我们只需关注domain,repository,s ...

  10. Liferay portlet首选项(preferences)设置、存储处理

    最近使用Liferay做项目集成,由于团队人员在之前对Liferay这东西都没有充分的了解,用起来着实费了不少力气,最近为了为定制好的portlet添加初始化信息,翻阅了一些文章,下面是了解到的关于初 ...