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. MobileMovieTexture播放视频

    MobileMovieTexture插件支持IOS系统播放视频文件.简单,方便

  2. EXADATA智能扫描

    提要:查询特定的要求:智能扫描只可用于完整的表或索引扫描.智能扫描只能用于直接路径读取: 直接路径读取会自动用于并行查询. 直接路径读取可以用于串行查询.默认情况下不使用它们进行小型表的串行扫描.使用 ...

  3. 第一个Django应用程序_part2

    一.数据库配置 此文延续第一个Django应用程序_part1. 打开mystic/settings.py.这是一个普通的Python模块,其模块变量表示Django配置 默认情况下,配置使用SQLi ...

  4. 2PC之JTA原理与实现

    转自:https://www.ibm.com/developerworks/cn/java/j-lo-jta/index.html 利用 JTA 处理事务 什么是事务处理 事务是计算机应用中不可或缺的 ...

  5. Linux hostname主机名配置文件与文件 /etc/hosts解析(copy来的,原作者看到了别打我)

    1.关于/etc/host,主机名和IP配置文件 Hosts - The static table lookup for host name(主机名查询静态表) hosts文件是Linux系统中一个负 ...

  6. radio后的input框数据传递

    <input type="radio" name="limit_type" value="total">活动期间,每个手机号可抽 ...

  7. 解决URL参数中文乱码

    string key = HttpUtility.UrlDecode(Request["key"], Encoding.UTF8);

  8. 公众号js-sdk简

    后台代码 jssdk.PHP——因sae的不可写环境,故需要将accesstoken和JsApiTicket存入数据库. 数据库字段:id(int 3),accesstoken(string 255) ...

  9. [Lua快速了解一下]Lua的函数

    -recurrsive function fib(n) end ) + fib(n - ) end -closure 示例一 function newCounter() return function ...

  10. VC++下的Unicode编程

    ASCII是用来表示英文字符的一种编码规范.每个ASCII字符占用1个字节,因此,ASCII编码可以表示的最大字符数是255(00H—FFH). 其实,英文字符并没有那么多,一般只用前128个(00H ...