题目

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

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

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

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


分析

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

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

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


代码

#include <cstdio>
#include <queue>
#include <cstring>
#define rr register
using namespace std;
struct rec{int x,y,S;}; queue<rec>q;
const int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
int spx[11],spy[11],n,m,cnt,po[11],dis[51][51][1024],ans[11];
bool v[51][51][1024]; char a[51][51];
inline signed min(int a,int b){return a<b?a:b;}
inline signed Turn_S(int x,int y,int SS){
for (rr int i=0;i<cnt;++i)
if (spx[i]>x&&spy[i]==y) SS^=po[i];
return SS;
}
inline void dfs(int SS,int dep,int now){
ans[now]=min(ans[now],dis[0][0][SS]);
if (dep==cnt) return;
if (a[spx[dep]][spy[dep]]=='I') dfs(SS|po[dep],dep+1,now+1);
dfs(SS,dep+1,now);
}
signed main(){
po[0]=1; rr char c;
for (rr int i=1;i<10;++i)
po[i]=po[i-1]+po[i-1];
for (n=1;(c=getchar())!=EOF;++n){
for (m=0;c=='.'||c=='I'||c=='X';c=getchar()){
a[n][++m]=c;
if (c!='.') spx[cnt]=n,spy[cnt]=m,++cnt;
}
}
memset(dis,42,sizeof(dis));
dis[0][0][0]=0,--n,v[0][0][0]=1,q.push((rec){0,0,0});
while (q.size()){
rr rec t=q.front(); rr int now=dis[t.x][t.y][t.S]; q.pop();
for (rr int k=0;k<4;++k){
rr int zx=t.x+dx[k],zy=t.y+dy[k],SS=t.S;
if (zx<0||zy<0||zx>n||zy>m) continue;
if (k&1) SS=Turn_S(t.x,k==3?t.y:zy,SS);
if (dis[zx][zy][SS]>now+1){
dis[zx][zy][SS]=now+1;
if (!v[zx][zy][SS]){
v[zx][zy][SS]=1;
q.push((rec){zx,zy,SS});
}
}
}
v[t.x][t.y][t.S]=0;
}
memset(ans,42,sizeof(ans));
dfs(0,0,0);
for (rr int i=1;i<=cnt;++i)
if (ans[i]<4e5) printf("%d\n",ans[i]);
return 0;
}

#搜索,计算几何#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. win32 - 使用CreateRemoteThread调用dll上的函数(建立管道)

    Dll: // dllmain.cpp : Defines the entry point for the DLL application. #include "pch.h" #i ...

  2. 反射,装饰器,类当中的方法,property---day24

    1.反射 # ### 反射(针对于类对象 模块) '''概念:通过字符串去操作类对象或者模块当中的成员(属性方法)''' class Man(): pass class Woman(): pass c ...

  3. pyqt5中通过pycharm配置designer(win和mac都适用,修改下designer目录路径即可)

    安装 pip install PyQt5 -i https://pypi.douban.com/simple pip install PyQt5-tools -i https://pypi.douba ...

  4. 浅谈errgroup的使用以及源码分析

    本文讲解的是golang.org/x/sync这个包中的errgroup 1.errgroup 的基础介绍 学习过 Go 的朋友都知道 Go 实现并发编程是比较容易的事情,只需要使用go关键字就可以开 ...

  5. 【Azure Redis 缓存】Redis 连接失败

    问题描述 Azure Redis 出现连接失败,过一会儿后,又能自动恢复. 问题解答 其实,因为Azure Redis服务一直都有升级维护的操作(平均每月一次),Redis服务更新是平台自动进行的计划 ...

  6. Find The Multiple 题解

      Find The Multiple The long-lost Sunday is coming again, and the ACM Laboratory Elimination Competi ...

  7. Fiddler修改响应体

    方法1 将请求从左侧列表中,拖入AutoResponder中. 然后右键规则,点击编辑 修改后点击save 方法2 在AutoResponder中选择Create New Response也可类似方式 ...

  8. ubuntu下安装numpy和scipy正确方法

    1.numpy NumPy(Numeric Python)是用Python进行科学计算的基本软件包. NumPy是Python编程语言的扩展,增加了对大型多维数组和矩阵的支持,以及一个大型的高级数学函 ...

  9. 可穿戴智能手环解决方案之BLE的ADV广播协议解读

    一 概念 直接上英文原文,怕自己的翻译误导大家. When a BLE device is advertising, it periodically transmits packets, which ...

  10. 多线程系列(二十) -CompletableFuture使用详解

    一.摘要 在上篇文章中,我们介绍了Future相关的用法,使用它可以获取异步任务执行的返回值. 我们再次回顾一下Future相关的用法. public class FutureTest { publi ...