POJ3322Bloxorz I
2024-05-09 10:49:33
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相关推荐
- POJ3322bloxorz
这道题目很适合学习广度优先搜搜的小盆友: Bloxorz是一个风靡世界的小游戏.Bloxorz的地图是一个N行M列的矩阵,每个位置可能是硬地(用.表示).易碎地面(用E表示).禁地(用#表示).起点( ...
最新文章
- linux c 文件指针 句柄(FILE*) 文件描述符(fd) 文件路径(filepath) 互相转换
- unslider的用法详解
- ASP.NET MVC学习之路由篇(2)
- 厉害了,ES 如何做到几十亿数据检索 3 秒返回!
- SAP CRM调查问卷的评分和图表显示功能介绍 1
- setjmp与logjmp用法总结
- 查看 rabbitmq 启动websocket 提示404_RabbitMQ在windows下安装(笔记)
- 推荐算法 php SQL,MixPHP 独特的SQL构建方式
- 28 PP配置-生产车间控制-工序-定义报工屏幕默认值
- 12006.eeprom之M24C02
- 计算机专业应届生年薪30多万,制造焦虑,非广告,请看截图
- mysql插入二进制命令_MySQL将语句写入到binlog二进制日志中
- GlusterFS分布式文件系统
- [转]linux 调用动态库so文件
- react - next.js 引用本地图片和css文件
- win10调整计算机字体大小,主编教您win10下怎么调整字体大小
- 专家不确定伊朗是否是银行 DDoS 攻击的幕后黑手
- 实验一 白盒测试用例设计
- 水晶报表 文件 xxxx{354234-523432-5235-325-2523}.rpt 文件内部出错:无法加载数据解决方案
- 从MWC到AWE,中国柔性黑科技为消费电子产业撒下蒲公英的种子
热门文章
- C语言编程>第二十周 ② 下列给定程序中,函数fun的功能是:求出数组中最大数和次最大数,并把最大数和b[0]中的数对调、次最大数和b[1]中的数对调。
- js自动缩放页面自适应屏幕分辨率
- 从.weights中提取权重数据
- 计算机图形学四:着色-Shading
- 【Shading】Shading 着色
- 计算机房颁奖词,网络达人奖颁奖词.doc
- building sasl.wrapper extention
- uniapp 标签技能多选 最多选三个
- YTU----1329: 手机尾号评分
- mysql5.7 1698 28000_MySqlError1698(28000)问题的解决方法