POJ3322 Bloxorz I

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

  1 #include <cstdio>
  2 #include <iostream>
  3 #include <cstring>
  4 #include <cmath>
  5 #include <queue>
  6 #include <algorithm>
  7 using namespace std;
  8
  9 #define res register int
 10 const int N=510;
 11 char s[N][N];
 12 int n,m,d[N][N][3];
 13 struct node{int x,y,lie;};//lie=0 立 lie=1 横向躺 lie=2 纵向躺
 14 node st,ed;
 15 queue<node> q;
 16 const int dx[4]={0,0,-1,1},dy[4]={-1,1,0,0};
 17
 18 inline bool valid(int x,int y){
 19     return x>0&&x<=n&&y>0&&y<=m;
 20 }
 21
 22 inline void read()
 23 {
 24     for(res i=1 ; i<=n ; i++)
 25         for(res j=1 ; j<=m ; j++) cin>>s[i][j];
 26     for(res i=1 ; i<=n ; i++)
 27         for(res j=1 ; j<=m ; j++)
 28         {
 29             if(s[i][j]=='O') ed.x=i,ed.y=j,ed.lie=0,s[i][j]='.';
 30             else if(s[i][j]=='X')
 31             {
 32                 for(res k=0 ; k<4 ; k++)
 33                 {
 34                     int x=i+dx[k],y=j+dy[k];
 35                     if(valid(x,y) && s[x][y] == 'X') {
 36                         st.x=min(i,x),st.y=min(j,y),st.lie=k<2?1:2;
 37                         s[i][j]=s[x][y]='.';
 38                         break;
 39                     }
 40                     if(s[i][j]=='X') st.x=i,st.y=j,st.lie=0,s[i][j]='.';
 41                 }
 42             }
 43         }
 44 }
 45
 46 const int next_x[3][4]={{0,0,-2,1},{0,0,-1,1},{0,0,-1,2}};
 47 const int next_y[3][4]={{-2,1,0,0},{-1,2,0,0},{-1,1,0,0}};
 48 const int next_lie[3][4]={{1,1,2,2},{0,0,1,1},{2,2,0,0}};
 49
 50 inline bool valid(node t)
 51 {
 52     if(!valid(t.x,t.y)) return false;
 53     int nx=t.x,ny=t.y;
 54     if(s[nx][ny]=='#') return false;
 55     if(t.lie==0 && s[nx][ny]!='.') return false;
 56     if(t.lie==1 && s[nx][ny+1]=='#') return false;
 57     if(t.lie==2 && s[nx+1][ny]=='#') return false;
 58     return true;
 59 }
 60
 61 inline int bfs()
 62 {
 63     for(res i=1 ; i<=n ; i++)
 64         for(res j=1 ; j<=m ; j++)
 65             for(res k=0 ; k<3 ; k++)    d[i][j][k]=-1;
 66     while(q.size()) q.pop();
 67     d[st.x][st.y][st.lie]=0; q.push(st);
 68     while(q.size())
 69     {
 70         node now=q.front(); q.pop();
 71         for(res i=0 ; i<4 ; i++)
 72         {
 73             node t;
 74             t.x=now.x+next_x[now.lie][i];
 75             t.y=now.y+next_y[now.lie][i];
 76             t.lie=next_lie[now.lie][i];
 77             if(!valid(t)) continue;
 78             if(d[t.x][t.y][t.lie]==-1)
 79             {
 80                 d[t.x][t.y][t.lie]=d[now.x][now.y][now.lie]+1;
 81                 q.push(t);
 82                 if(t.x==ed.x && t.y==ed.y && t.lie==ed.lie)
 83                     return d[t.x][t.y][t.lie];
 84             }
 85         }
 86     }
 87     return -1;
 88 }
 89
 90 int main()
 91 {
 92     while(scanf("%d %d",&n,&m)==2 && n && m)
 93     {
 94         read();
 95         int ans=bfs();
 96         if(ans==-1) puts("Impossible");
 97         else printf("%d\n",ans);
 98     }
 99
100     return 0;
101 }

View Code

转载于:https://www.cnblogs.com/wmq12138/p/10381583.html

POJ3322Bloxorz I相关推荐

  1. POJ3322bloxorz

    这道题目很适合学习广度优先搜搜的小盆友: Bloxorz是一个风靡世界的小游戏.Bloxorz的地图是一个N行M列的矩阵,每个位置可能是硬地(用.表示).易碎地面(用E表示).禁地(用#表示).起点( ...

最新文章

  1. linux c 文件指针 句柄(FILE*) 文件描述符(fd) 文件路径(filepath) 互相转换
  2. unslider的用法详解
  3. ASP.NET MVC学习之路由篇(2)
  4. 厉害了,ES 如何做到几十亿数据检索 3 秒返回!
  5. SAP CRM调查问卷的评分和图表显示功能介绍 1
  6. setjmp与logjmp用法总结
  7. 查看 rabbitmq 启动websocket 提示404_RabbitMQ在windows下安装(笔记)
  8. 推荐算法 php SQL,MixPHP 独特的SQL构建方式
  9. 28 PP配置-生产车间控制-工序-定义报工屏幕默认值
  10. 12006.eeprom之M24C02
  11. 计算机专业应届生年薪30多万,制造焦虑,非广告,请看截图
  12. mysql插入二进制命令_MySQL将语句写入到binlog二进制日志中
  13. GlusterFS分布式文件系统
  14. [转]linux 调用动态库so文件
  15. react - next.js 引用本地图片和css文件
  16. win10调整计算机字体大小,主编教您win10下怎么调整字体大小
  17. 专家不确定伊朗是否是银行 DDoS 攻击的幕后黑手
  18. 实验一 白盒测试用例设计
  19. 水晶报表 文件 xxxx{354234-523432-5235-325-2523}.rpt 文件内部出错:无法加载数据解决方案
  20. 从MWC到AWE,中国柔性黑科技为消费电子产业撒下蒲公英的种子

热门文章

  1. C语言编程>第二十周 ② 下列给定程序中,函数fun的功能是:求出数组中最大数和次最大数,并把最大数和b[0]中的数对调、次最大数和b[1]中的数对调。
  2. js自动缩放页面自适应屏幕分辨率
  3. 从.weights中提取权重数据
  4. 计算机图形学四:着色-Shading
  5. 【Shading】Shading 着色
  6. 计算机房颁奖词,网络达人奖颁奖词.doc
  7. building sasl.wrapper extention
  8. uniapp 标签技能多选 最多选三个
  9. YTU----1329: 手机尾号评分
  10. mysql5.7 1698 28000_MySqlError1698(28000)问题的解决方法