POJ3322 Bloxorz I

暴搜,next数组与处理一下(小技巧)

 #include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <queue>
#include <algorithm>
using namespace std; #define res register int
const int N=;
char s[N][N];
int n,m,d[N][N][];
struct node{int x,y,lie;};//lie=0 立 lie=1 横向躺 lie=2 纵向躺
node st,ed;
queue<node> q;
const int dx[]={,,-,},dy[]={-,,,}; inline bool valid(int x,int y){
return x>&&x<=n&&y>&&y<=m;
} inline void read()
{
for(res i= ; i<=n ; i++)
for(res j= ; j<=m ; j++) cin>>s[i][j];
for(res i= ; i<=n ; i++)
for(res j= ; j<=m ; j++)
{
if(s[i][j]=='O') ed.x=i,ed.y=j,ed.lie=,s[i][j]='.';
else if(s[i][j]=='X')
{
for(res k= ; k< ; k++)
{
int x=i+dx[k],y=j+dy[k];
if(valid(x,y) && s[x][y] == 'X') {
st.x=min(i,x),st.y=min(j,y),st.lie=k<?:;
s[i][j]=s[x][y]='.';
break;
}
if(s[i][j]=='X') st.x=i,st.y=j,st.lie=,s[i][j]='.';
}
}
}
} const int next_x[][]={{,,-,},{,,-,},{,,-,}};
const int next_y[][]={{-,,,},{-,,,},{-,,,}};
const int next_lie[][]={{,,,},{,,,},{,,,}}; inline bool valid(node t)
{
if(!valid(t.x,t.y)) return false;
int nx=t.x,ny=t.y;
if(s[nx][ny]=='#') return false;
if(t.lie== && s[nx][ny]!='.') return false;
if(t.lie== && s[nx][ny+]=='#') return false;
if(t.lie== && s[nx+][ny]=='#') return false;
return true;
} inline int bfs()
{
for(res i= ; i<=n ; i++)
for(res j= ; j<=m ; j++)
for(res k= ; k< ; k++) d[i][j][k]=-;
while(q.size()) q.pop();
d[st.x][st.y][st.lie]=; q.push(st);
while(q.size())
{
node now=q.front(); q.pop();
for(res i= ; i< ; i++)
{
node t;
t.x=now.x+next_x[now.lie][i];
t.y=now.y+next_y[now.lie][i];
t.lie=next_lie[now.lie][i];
if(!valid(t)) continue;
if(d[t.x][t.y][t.lie]==-)
{
d[t.x][t.y][t.lie]=d[now.x][now.y][now.lie]+;
q.push(t);
if(t.x==ed.x && t.y==ed.y && t.lie==ed.lie)
return d[t.x][t.y][t.lie];
}
}
}
return -;
} int main()
{
while(scanf("%d %d",&n,&m)== && n && m)
{
read();
int ans=bfs();
if(ans==-) puts("Impossible");
else printf("%d\n",ans);
} return ;
}

POJ3322Bloxorz I的更多相关文章

随机推荐

  1. 使用Jenkins集成和自动化打包资料

    1.手把手教你利用Jenkins持续集成iOS项目 http://www.jianshu.com/p/41ecb06ae95f 2.Jenkins+ Xcode+ 蒲公英 实现IOS自动化打包和分发 ...

  2. SpringMVC单元测试-MockMvc

    一 简介 MockMvc实现对Http请求的模拟,可以方便对Controller进行测试,使得测试速度快.不依赖网络环境,而且提供验证的工具,使得请求的验证统一而且很方便.   二 常见使用方式 1  ...

  3. 825. Friends Of Appropriate Ages有效的好友请求的数量

    [抄题]: Some people will make friend requests. The list of their ages is given and ages[i] is the age ...

  4. CentOS JAVA安装及查看路径方法

    一.安装: 方法一:手动解压JDK的压缩包,然后设置环境变量 1.在/usr/目录下创建java目录 [root@localhost ~]# mkdir/usr/java[root@localhost ...

  5. TensorFlow全新的数据读取方式:Dataset API入门教程

    TensorFlow.data : http://tech.ifeng.com/a/20171109/44752505_0.shtml Pytorch:https://ptorch.com/docs/ ...

  6. Mcrosoft中间语言的主要特征

    Mcrosoft中间语言显然在.NET FrameWork中起着非常重要的作用.现在讨论一下IL(Intermideate Language)的主要特征.因为面向.NET的所有语言在逻辑上都需要支持I ...

  7. 开发高性能的MongoDB应用—浅谈MongoDB性能优化(转)

    出处:http://www.cnblogs.com/mokafamily/p/4102829.html 性能与用户量 “如何能让软件拥有更高的性能?”,我想这是一个大部分开发者都思考过的问题.性能往往 ...

  8. [GO]通过结构体生成json

    package main import ( "encoding/json" "fmt" ) type IT struct { //一定要注意这里的成员变量的名字 ...

  9. linux系统学习(二)

    文件,目录 pwd:查看当前目录 Print Working Directory cd,ls(ll),mkdir -p Change Directory List Make Directory du ...

  10. zookeeper学习及安装

    HBase提示已创建表,但是list查询时,却显示表不存在. https://blog.csdn.net/liu16659/article/details/80216085 http://archiv ...