题目地址
POJ3322
一道代码量比较大的题目

  • 遇见这种地图bfs的要学会建立常数数组保存信息
  • 判别式子尽量用函数(如果比较繁杂的话)
  • (不错的搜索题)
#include<iostream>
#include<queue>
#include<algorithm>
#include<cstdio>
using namespace std;struct rec{int x,y,lie;
};char s[510][510];
rec st, ed;
int n, m, d[510][510][3];
queue<rec>q;
const int dx[4] = {0, 0, -1, 1}, dy[4] = {-1, 1, 0, 0};const int next_x[3][4] = {{0,0,-2,1},{0,0,-1,1},{0,0,-1,2}};
const int next_y[3][4] = {{-2,1,0,0},{-1,2,0,0},{-1,1,0,0}};
const int next_lie[3][4] = {{1,1,2,2},{0,0,1,1},{2,2,0,0}};bool valid(int x, int y){return x >= 1 && y >= 1&& x <= n && y <= m;
}bool valid(rec next){if(!valid(next.x, next.y))return 0;if(s[next.x][next.y] == '#')return 0;if(next.lie == 0 && s[next.x][next.y]!='.')return 0;if(next.lie == 1 && s[next.x][next.y + 1] == '#')return 0;if(next.lie == 2 && s[next.x + 1][next.y] == '#')return 0;return 1;
}void pre(){for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){if(s[i][j] == 'O'){ed.x = i;ed.y = j;ed.lie = 0;s[i][j] = '.';}else if(s[i][j] == 'X'){for(int k = 0; k < 4; k++){int x = i + dx[k];int 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<2 ? 1 : 2;s[x][y] = s[i][j] = '.';break;}if(s[i][j] == 'X'){st.x = i;st.y = j;st.lie = 0;}}}} }
}int bfs(){for(int i = 1;i<=n;i++){for(int j =1;j<=m;j++){for(int k =0;k<3;k++)d[i][j][k] = -1;}}while(q.size()){q.pop();}d[st.x][st.y][st.lie] = 0;q.push(st);while(q.size()){rec now = q.front();q.pop();for(int i = 0; i<4;i++){rec next;next.x = now.x+next_x[now.lie][i];next.y = now.y+next_y[now.lie][i];next.lie = next_lie[now.lie][i];if(!valid(next))continue;if(d[next.x][next.y][next.lie] == -1){d[next.x][next.y][next.lie] = d[now.x][now.y][now.lie]+1;q.push(next);if(next.x == ed.x&&next.y == ed.y&&next.lie == ed.lie)return d[next.x][next.y][next.lie];}}} return -1;
}int main(){while(cin>>n>>m&&n){for(int i=1;i<=n;i++)scanf("%s",s[i] + 1);pre();int ans = bfs();if(ans == -1)printf("Impossible\n");elsecout << ans << endl;}return 0;
}

POJ3322(bfs+状态限制)相关推荐

  1. BFS+状态压缩 hdu-1885-Key Task

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1885 题目意思: 给一个矩阵,给一个起点多个终点,有些点有墙不能通过,有些点的位置有门,需要拿到相应 ...

  2. csu 1536 Bit String Reordering(模拟 bfs+状态压缩)

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1536 题意: 输入n个只为 0或1 的数 形成一个排列 再输入m个数 每个数代表 目标排列 (样例 ...

  3. BFS + 状态压缩总结

    BFS + 状态压缩使用条件 求最短路径时,一般来说会优先考虑使用BFS算法.BFS算法在广度优先搜索的过程中会有一个类似vis的数组去重,避免重复访问 但是在一些情况下,题目需要求最短路径的同时,有 ...

  4. nyist 999 师傅又被妖怪抓走了 【双广搜 || BFS +状态压缩】

    题目:nyist 999 师傅又被妖怪抓走了 分析:在一个图中只要看到D点和E点就行的最小步数,看到的定义是:也就是说两个人在同一行或者同一列,并且中间没有障碍物或者没有其他人就可以看到对方. 所以可 ...

  5. bfs+状态压缩dp

    题意:       给你一个地图,问你吧所有的隧道都走完的最小费用,起点不固定,穿越隧道的时间不计,在隧道外边每移动一步花费一秒. 思路:       先bfs求出所有dis[i][j](i的终点和j ...

  6. poj 1324(BFS+状态压缩)

    解题思路:这道题一开始的想法就是状态压缩,即考虑如何判重,由于蛇并非是直线的,所以想到了以每一个点的上下左右共四个 值来表示相对位置.最开始想如何用四进制来表示它,无语.....还是题目做少了,直接用 ...

  7. hdu 1429 胜利大逃亡(续) bfs+状态压缩

    胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  8. POJ - 3322 Bloxorz I(bfs+状态设计)

    题目链接:点击查看 题目大意:模拟Bloxorz小游戏找出最优解,简单说一下规则,给出一个n*m的矩阵,其中,"#"代表墙,"X"代表起点,"O&qu ...

  9. BZOJ1195[HNOI2006]最短母串——AC自动机+BFS+状态压缩

    题目描述 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串. 输入 第一行是一个正整数n(n<=12),表示给定的字符串的 ...

最新文章

  1. 【 MATLAB 】【 MATLAB 】DFT的性质讨论(三)序列的循环卷积及其 MATLAB 实现
  2. 华硕主板X99-E WS/USB 3.1 Intel Realsense D435摄像头掉线是否与Intel推行的xhci有关?
  3. 关于登陆到域的用户,不需要显示登陆界面的问题(aspx)
  4. java中避免空指针_在Java中避免空检查
  5. 最有价值的100句话
  6. MYSQL中有时候不得不使用replace()去掉特殊字符,写在这里备用一下
  7. 路由器 刷 linux系统版本,在Linux下用tftp刷写路由器固件
  8. php stomp rabbitmq,docker环境下的RabbitMQ部署,Spring AMQP使用
  9. Open3d之颜色映射优化
  10. struts2 中的零配置
  11. 20. 自定义配置文件
  12. 阿里云毕龙飞:五个维度推进企业生产关系数字化
  13. VsCode必备插件
  14. VBA Excel 实践(三)Excel控件及Excel控件的初始化
  15. 项目实施过程中的标志性事件——里程碑
  16. Windows 10微软拼音中添加自定义短语
  17. 使用CollectionView简单实现轮播广告栏效果
  18. 没钱没资源没人脉?年入千万的她写了这本副业思维的书
  19. Mysql-mmm高可用集群
  20. 问题: Mac外联硬盘不能更改“-”中的一个或多个项目,因为它们正在使用中

热门文章

  1. 微信个人好友增加到10000人啦!
  2. html5怎么修改图片大小,HTML5 javascript修改canvas的大小
  3. Kotlin泛型上界与扩展函数
  4. Unity开发手游常用适配分辨率
  5. 从TMP文件恢复Word文件
  6. python画布删除图形_Matplotlib在savefig之后从画布中清除旧图形
  7. php开发天气可视化,R语言天气可视化应用 | 粉丝日志
  8. matlab 语音识别为文字,语音识别(Speech Recognition)是让机器通过识别和理解过程把语音信号转变为相应的文本...
  9. Unreal Engine 4(虚幻UE4)GameplayAbilities 插件入门教程(三)技能标签(Ability Tags)...
  10. 超声波阵列功率驱动:利用MX1919驱动