题目

在\(n\)行\(m\)列的网格中,你要圈一些地。

你从左上角出发,最后返回左上角,路径内部的区域视为被你圈住。 你不可以进入网格内部, 只能在边上行走。 你的路径不能在左上角以外自交, 但是边足够宽, 你可以重复经过而不自交。

网格中有一些格子对你很重要,你要尽量圈住它;而另一些格子对你有坏处,你不能圈住它。

求圈住\(i\)个重要的格子的最小路径长度。(\(n,m\leq 50,Special Block\leq 10\))


分析

自交除了左上角完全可以被等价的方案代替,所以可以忽略它,接着如何保证好的被圈,坏的不被圈,

把一个点向任意方向引一条射线,如果这条线穿过奇数次多边形,那么点在多边形内,否则点在多边形外,

所以可以判断竖着的边(横着的边也行),然后记录选取的状态跑SPFA,再深搜选取


代码

  1. #include <cstdio>
  2. #include <queue>
  3. #include <cstring>
  4. #define rr register
  5. using namespace std;
  6. struct rec{int x,y,S;}; queue<rec>q;
  7. const int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
  8. int spx[11],spy[11],n,m,cnt,po[11],dis[51][51][1024],ans[11];
  9. bool v[51][51][1024]; char a[51][51];
  10. inline signed min(int a,int b){return a<b?a:b;}
  11. inline signed Turn_S(int x,int y,int SS){
  12. for (rr int i=0;i<cnt;++i)
  13. if (spx[i]>x&&spy[i]==y) SS^=po[i];
  14. return SS;
  15. }
  16. inline void dfs(int SS,int dep,int now){
  17. ans[now]=min(ans[now],dis[0][0][SS]);
  18. if (dep==cnt) return;
  19. if (a[spx[dep]][spy[dep]]=='I') dfs(SS|po[dep],dep+1,now+1);
  20. dfs(SS,dep+1,now);
  21. }
  22. signed main(){
  23. po[0]=1; rr char c;
  24. for (rr int i=1;i<10;++i)
  25. po[i]=po[i-1]+po[i-1];
  26. for (n=1;(c=getchar())!=EOF;++n){
  27. for (m=0;c=='.'||c=='I'||c=='X';c=getchar()){
  28. a[n][++m]=c;
  29. if (c!='.') spx[cnt]=n,spy[cnt]=m,++cnt;
  30. }
  31. }
  32. memset(dis,42,sizeof(dis));
  33. dis[0][0][0]=0,--n,v[0][0][0]=1,q.push((rec){0,0,0});
  34. while (q.size()){
  35. rr rec t=q.front(); rr int now=dis[t.x][t.y][t.S]; q.pop();
  36. for (rr int k=0;k<4;++k){
  37. rr int zx=t.x+dx[k],zy=t.y+dy[k],SS=t.S;
  38. if (zx<0||zy<0||zx>n||zy>m) continue;
  39. if (k&1) SS=Turn_S(t.x,k==3?t.y:zy,SS);
  40. if (dis[zx][zy][SS]>now+1){
  41. dis[zx][zy][SS]=now+1;
  42. if (!v[zx][zy][SS]){
  43. v[zx][zy][SS]=1;
  44. q.push((rec){zx,zy,SS});
  45. }
  46. }
  47. }
  48. v[t.x][t.y][t.S]=0;
  49. }
  50. memset(ans,42,sizeof(ans));
  51. dfs(0,0,0);
  52. for (rr int i=1;i<=cnt;++i)
  53. if (ans[i]<4e5) printf("%d\n",ans[i]);
  54. return 0;
  55. }

#搜索,计算几何#JZOJ 4016 圈地为王的更多相关文章

  1. MapReduce明星搜索指数统计,找出人气王

    我们继续通过项目强化掌握Combiner和Partitioner优化Hadoop性能 1.项目介绍 本项目我们使用明星搜索指数数据,分别统计出搜索指数最高的男明星和女明星. 2.数据集 3.分析 基于 ...

  2. Hadoop实战:明星搜索指数统计,找出人气王

    项目介绍 本项目我们使用明星搜索指数数据,分别统计出搜索指数最高的男明星和女明星. 数据集 明星搜索指数数据集,如下图所示.猛戳此链接下载数据集 思路分析 基于项目的需求,我们通过以下几步完成: 1. ...

  3. UMHexagonS搜索过程

    通过相邻块的预测得到mvp后,会以mvp为基础搜索最佳的匹配块,UMHexagonS就是h.264中用的一种搜索算法. UMHexagonS是一种整像素搜索算法,也就是搜索过程中,参考图像一直都是原来 ...

  4. pick王菊?作为“菊外人”的程序员能做点什么?

    转载:https://mp.weixin.qq.com/s/s1cb9Ij6ouTYYCZovLhXTA 最近,想必大家的朋友圈都被“王菊”占领了,打开朋友圈到处可以见到“pick王菊”.“陶渊明”. ...

  5. 什么?女神发了朋友圈,快来围观之Java设计模式:观察者模式

    目录 观察者模式 示例 定义 设计原则 意图 主要解决问题 何时使用 优缺点 女神和追求者的故事 Java中的实现 观察者模式 示例 微信公众号,关注就可以收到推送的消息,取消关注就不会收到 定义 定 ...

  6. 北大 ACM 分类 汇总

    1.搜索 //回溯 2.DP(动态规划) 3.贪心 北大ACM题分类2009-01-27 1 4.图论 //Dijkstra.最小生成树.网络流 5.数论 //解模线性方程 6.计算几何 //凸壳.同 ...

  7. 打败Google的灵童今在何方?

    微软和雅虎宣布在搜索和广告上10年合作,这事儿不知是不是前不久虚惊一场的微软收购雅虎案的好戏重演之序幕. 从表面上看,这次的合作改变不了搜索和广告目前的世界格局,也构不成对Google的致命威胁,反倒 ...

  8. Nutch+Lucene搜索引擎开发实践

    网络拓扑 图 1 网络拓扑图 安装Java JDK 首先查看系统是否已经安装了其它版本号的JDK,假设有,先要把其它版本号的JDK卸载. 用root用户登录系统. # rpm-qa|grep gcj ...

  9. 微信小程序外包 就找北京动软 专业承接微信小程序定制

    很多人问为什么要开发微信小程序,微信小程序的“入口”在哪儿? 1.只有访问过的小程序,才会出现所谓的「入口」. 所有访问过得小程序都可以从微信首屏下面的「发现」点过去.(必须是最新版微信) 这个所谓的 ...

  10. Android自动化测试学习路线

    最近在整理Android自动化测试的相关资料,大体上把一些知识点梳理了,这里做一个简单的分享! Android里面测试相关的工具和框架太多了.你应该从以下几个方面入手. 编程语言的选择 如果你要学习的 ...

随机推荐

  1. IDEA git分支回退指定的历史版本

    https://blog.csdn.net/woshi1226a/article/details/86664159

  2. ubantu中安装redis及遇到的问题

    安装命令 sudo apt-get install redis-server 开启远程连接 找到vi /etc/redis/redis.conf文件修改如下 bind 127.0.0.1 为 0.0. ...

  3. [golang] 概念: struct vs interface

    struct vs interface go语言的简化哲学: class = struct + receiver method set 注意: go 语言的struct,在参数传递中,是值拷贝. st ...

  4. 【Azure 应用服务】用App Service部署运行 Vue.js 编写的项目,应该怎么部署运行呢?

    问题描述 用App Service部署运行 Vue.js 编写的项目,应该怎么部署运行呢? 问题解答 VUE通常是运行在客户端侧的JS框架. App Service 在这种场景中是以静态文件的形式提供 ...

  5. C++ STL 容器 forward_list类型

    C++ STL 容器 forward_list类型 介绍 std::forward_list 是 C++ 标准模板库 (STL) 中的一个单向链表容器.与 std::list 不同,std::forw ...

  6. Educational Codeforces Round 143 (Rated for Div. 2)C. Tea Tasting(前缀和+二分、贡献枚举)

    C. Tea Tasting 思路 这里枚举有三种思路 然后经过考虑3是最可行的,然后接着考虑如何计算贡献 这里在实现的时候用了一个差分数组,因为我们需要记录第i个茶师它喝了多少个\(b_i\)以及不 ...

  7. 用java实现书城项目(简单增删改查2)

    书城项目 登录 dao 接口:UserDao Users login(String username,String password); 实现:UserDaoImpl QueryRunner quer ...

  8. 告别os.path,拥抱pathlib

    pathlib 模块是在Python3.4版本中首次被引入到标准库中的,作为一个可选模块.从Python3.6开始,内置的 open 函数以及 os . shutil 和 os.path 模块中的各种 ...

  9. mybatis使用postgresql中的jsonb数据类型

    最近新开发的一个功能使用到postgresql中的jsonb数据类型.架构师可能考虑到这种数据格式更加便于存储json格式的数据,因此考虑使用这种数据类型.自己以前未曾使用过这种数据类型,因此需要现学 ...

  10. 第143篇:手写vue-router,实现router-view

    好家伙,   今天来手写我们的老伙计vue-router,   1.替换router 新开一个项目,并使用我们手写的router   2.大致结构 let Vue; // 保存vue的构造函数 cla ...