【大意】

在n*m(n<=20,m<=20)的网格中,有若干的激光发射器,激光发射器面朝上或者下或左或右,激光被终止于激光发射器或者障碍,somebody想从网格的A点走到B点,somebody可以从8个方向走,但她不能连续在有激光的地方走,也就是说她走得路径的相邻2格内至多只有一个格子上有激光,问路径上最少有几个格子被激光照射。

【分析】

典型的bfs。

注意激光发射器和障碍一样不能走。

在扩展节点的时候当前节点有激光时不扩展下一个也有激光的节点。

路径记录当前路径走过的有激光的格子数目。

也可以加点启发式信息,记h为从当前节点到目标节点最少路过的有激光的节点,可以用floyd先计算出任意2个节点的最少激光节点路径(效率过低,反倒更慢了。。),再用A*。

【参考代码】

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <map>
#include <functional>
#include <algorithm>
#include <queue>using namespace std;inline bool get(int &t)
{bool flag = 0 ;char c;while(!isdigit(c = getchar())&&c!='-') if( c == -1 ) break ;if( c == -1 ) return 0 ;if(c=='-') flag = 1 , t = 0 ;else t = c ^ 48;while(isdigit(c = getchar()))    t = (t << 1) + (t << 3) + (c ^ 48) ;if(flag) t = -t ;return 1 ;
}typedef pair<int,int> pii ;
const int INF = 0x1fffffff ;
const int maxn = 22 ;
int n , m , sx , sy , ex , ey , border[maxn][maxn] , dist[maxn][maxn] , rep[128] ;
char dir[maxn][maxn] ;
bool vis[maxn][maxn] ;
const int cx[] = {1,0,0,-1} ;
const int cy[] = {0,1,-1,0} ;
const int ccx[] = {-1,-1,-1,0,0,1,1,1};
const int ccy[] = {-1,0,1,-1,1,-1,0,1};inline void init()    //set laser
{int i , j , k , x , y ;for( i = 1 ; i <= n ; i++)for( j = 1 ; j <= m ; j++)dist[i][j] = INF ;dist[sx][sy] = 0 ;for( i = 1 ; i <= n ; i++){for( j = 1 ; j <= m ; j++) if( border[i][j] == 1 && dir[i][j] != -1 ){k = dir[i][j] ; x = i + cx[k] ;    y = j + cy[k] ;   border[i][j] = 2 ;while ( x >= 1 && x <= n && y >= 1 && y <= m && border[x][y] != 2 ){border[x][y] = 1 ;x += cx[k] ;y += cy[k] ;}}}
}inline void solve()
{init();queue<pii> q ;q.push(make_pair(sx,sy));memset(vis,0,sizeof(vis));vis[sx][sy] = 1 ;while(!q.empty()){int i , j , k , x , y , nx , ny ;x = q.front().first ;    y = q.front().second ;vis[x][y] = 0 ;q.pop();if( border[x][y] == 0 ){for( k = 0 ; k < 8 ; k++){nx = x + ccx[k] ;ny = y + ccy[k] ;if ( nx >= 1 && nx <= n && ny >= 1 && ny <= m ){if( border[nx][ny] == 0 && dist[nx][ny] > dist[x][y] ){dist[nx][ny] = dist[x][y] ;if(!vis[nx][ny])    q.push(make_pair(nx,ny)),vis[nx][ny]=1;}else if( border[nx][ny] == 1 && dist[nx][ny] > dist[x][y] + 1 ){dist[nx][ny] = dist[x][y] + 1 ;if(!vis[nx][ny])    q.push(make_pair(nx,ny)),vis[nx][ny]=1;}}}}else{for( k = 0 ; k < 8 ; k++){nx = x + ccx[k] ;ny = y + ccy[k] ;if ( nx >= 1 && nx <= n && ny >= 1 && ny <= m && border[nx][ny] == 0 && dist[nx][ny] > dist[x][y] ){dist[nx][ny] = dist[x][y] ;if(!vis[nx][ny])    q.push(make_pair(nx,ny)),vis[nx][ny]=1;}}}}printf("%d\n",dist[ex][ey]==INF?-1:dist[ex][ey]);
}int main()
{int i , x , y , j , k ;char op[10];rep['d'] = 0 ;rep['l'] = 2 ;rep['u'] = 3 ;rep['r'] = 1 ;while (get(n)){get(m);get(sx); get(sy); get(ex); get(ey);get(k);memset(border,0,sizeof(border));for( i = 0 ; i < maxn ; i++)for( j = 0 ; j < maxn ; j++)dir[i][j] = -1 ;while(k--){get(x);    get(y);scanf("%s",op);if( op[0] != 'B' ) //laser{dir[x][y] = rep[op[0]] ;border[x][y] = 1 ;}else border[x][y] = 2 ;    //obstacle}solve();}
}

zoj1479 dweep soj1106 搜索相关推荐

  1. NOIP 好题推荐(DP+搜索+图论)POJ ZOJ

    NOIP好题推荐(DP+搜索+图论)POJ ZOJ 1370 Gossiping (数论->模线性方程有无解的判断)+(图论->DFS)  1090 Chain ->格雷码和二进制码 ...

  2. VS Code 配置调试参数、launch.json 配置文件属性、task.json 变量替换、自动保存并格式化、空格和制表符、函数调用关系、文件搜索和全局搜索、

    1. 生成配置参数 对于大多数的调试都需要在当前项目目录下创建一个 lanch.json 文件,位置是在当前项目目录下生成一个 .vscode 的隐藏文件夹,在里面放置一些配置内容,比如:settin ...

  3. 浅显易懂 Makefile 入门 (03)— 目标文件搜索(VPATH 和 vpath 的区别和使用)、隐含规则

    1. 目标文件搜索(VPATH和vpath) 如果需要的文件是存在于不同的路径下(即源文件与 Makefile 文件不在同一个路径下),在编译的时候就用到了 Makefile 中为我们提供的目录搜索文 ...

  4. Windows10自带搜索增强设置

    操作系统:Windows10 前言:Windows自带的搜索速度非常慢,因此有人借助Everything等索引软件进行搜索,能够显著提升搜索速度.但是Windows自带的搜索在进行一些设置以后也能达到 ...

  5. listary 指定目录搜索_everything

    20211009 https://zhuanlan.zhihu.com/p/225414423 listary详细使用 20210710 everything搜索文件,结果出现相同的2个重复情况,路径 ...

  6. LeetCode简单题之二叉搜索树中的搜索

    题目 给定二叉搜索树(BST)的根节点 root 和一个整数值 val. 你需要在 BST 中找到节点值等于 val 的节点. 返回以该节点为根的子树. 如果节点不存在,则返回 null . 示例 1 ...

  7. Hexo集成Algolia实现搜索功能

    2年前搭建的hexo博客好久没有维护了,一看 hexo 以及先前使用 butterfly 主题已经更新好几个版本了,看介绍在速度性能上有了很大的提高,于是打算给 hexo 升个级,整理整理翻翻新.通过 ...

  8. 目标识别的选择性搜索

    目标识别的选择性搜索 Selective Search for Object Recognition 论文地址: https://ivi.fnwi.uva.nl/isis/publications/b ...

  9. 2021年大数据ELK(四):Lucene的美文搜索案例

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 美文搜索案例 一.需求 二.准备工作 1.创建IDEA项目 2. ...

  10. [C] 深度优先搜索解决连通块/染色问题——求岛的个数

    本文介绍用DFS解决连通块个数问题 有关dfs的介绍见另外一篇:不撞南墙不回头--深度优先搜索 例题 宝岛探险 题目描述 一个小岛由一个主岛和一些复附属岛屿组成,该岛使用一个二维矩阵表示,其中数字表示 ...

最新文章

  1. Golang 本地帮助文档
  2. 从TCP到RDMA网络最新技术|扩展技术视野
  3. Vue 3.1.0 的 beta 版发布
  4. “3D几何与视觉技术”全球在线研讨会第四期~几何深度学习
  5. 一道关于String的易错习题
  6. Linux上更新war包
  7. 网站的服务器怎么维护,网站服务器怎么维护
  8. css中的大于号是什么意思 有何作用
  9. 过滤HTML标记、HTML注释、“!@#¥%”等非法字符
  10. 60.Linux/Unix 系统编程手册(下) -- SOCKET: 服务器设计
  11. 朴素贝叶斯算法优缺点
  12. c语言程序设计身高体重测评系统,C语言程序设计验.doc
  13. 2022最全知识点——RF接口自动化框架项目实战
  14. 系统监视器(Sysmon)工具的使用
  15. html浮窗音乐播放器插件,墨涩网 - WordPress浮窗音乐播放器Floating Window Music Player V3.2.6——墨涩网...
  16. python 实现盒滤波boxfilter
  17. 工赋开发者社区 | (案例)中译语通:差别化纺纱柔性智慧工厂
  18. 怎么翻译整篇Excel文档?Excel文档翻译一招搞定
  19. 异常处理 ?处理(try-catch) :甩锅(throws)_ java异常(Exception)处理
  20. 如何提高你的沟通能力25个要点

热门文章

  1. 语句覆盖、条件覆盖、判定覆盖、条件-判定覆盖、组合覆盖、路径覆盖
  2. 想学PLC编程,先弄清5种PLC专用语言
  3. spring quartz 表达式在线生成器
  4. 汇总|医学图像分析领域论文
  5. 计算机应用基础的课程讨论,(计算机教学论文:计算机应用基础课程教学方法的讨论.doc...
  6. Arduino应用开发——LCD显示图片
  7. CRC循环冗余校验码计算器(附C++ 和Qt实现的CRC-16/MODBUS代码)
  8. 遗传算法(geatpy)
  9. 环洋市场调研-2021年全球Camlock联轴器行业调研及趋势分析报告
  10. oracle12C以上版本创建pdb数据库实例实践