题目

https://gmoj.net/senior/#main/show/6841

题解

这道题目我考场上搞了好久都没有想清楚,考完后发现解法有很多。

解法1

——SLSSLSSLS大佬的解法。

考虑通过植树造林把森林变成一个矩形。
那么什么样的点上面要种树呢?

  1. 正上方、正下方都有X的点;
  2. 在一个’L’中的点(图中的两个位置Y中任意一个是X就要在A上面种树):

植树造林之后我们就得到了一个凸多边形。
怎么求答案呢?先把沿着它走的路径上的点求出来,如下图的+

然后从一个到起点的距离大于到起点的切比雪夫距离的点开始,顺时针或逆时针给+标号(因为这里写不下两位数,就用了26进制表示):

然后把到起点的距离等于到起点的切比雪夫距离的点取出来,最短路径为起点->它们中标号最大的点->多边形的背后->它们中标号最小的点->起点

实现比较麻烦。

解法2

——xiaoqixiaoqixiaoqi大佬的解法

选树林边上y最小的点(这个点是必须经过的),然后把它左边的点全部删掉,再在它上面打上标记(不能走),接着从起点走到它的两边,再合并答案。

解法3

——大佬2016吴家庆的解法

其实和解法2类似。
找出树林中y最小的点,从它向左修建一排栅栏(就是不能走的标记):

接着对于每一个栅栏上的点,将它上、下到起点的距离合并即可。

注意当起点刚好在y最小的点向左的栅栏上时,答案是错的,这时选择y最大的点向右修栅栏即可。

解法4

——大佬LZA的解法

做凸包。

CODE(解法3)

#include<cstdio>
#include<cstring>
using namespace std;
#define M 4000005
#define N 2005
const int dx[8]={1,1,1,0,0,-1,-1,-1},dy[8]={0,1,-1,1,-1,0,1,-1};
char a[N][N];int f[N][N],data[M][2],n,m;
inline void bfs(int stx,int sty)
{int x,y,xx,yy,head=0,tail=1;data[1][0]=stx,data[1][1]=sty;memset(f,0x3f,sizeof f);f[stx][sty]=0;while(head<tail){x=data[++head][0],y=data[head][1];for(int i=0;i<8;++i){xx=x+dx[i],yy=y+dy[i];if(xx&&yy&&xx<=n&&yy<=m&&a[xx][yy]=='.'&&f[xx][yy]>f[x][y]+1){f[xx][yy]=f[x][y]+1;data[++tail][0]=xx,data[tail][1]=yy;}}}
}
int main()
{freopen("forest.in","r",stdin);freopen("forest.out","w",stdout);int stx,sty,x=0,y=0,ans=999999999,up,down;scanf("%d%d",&n,&m);for(int i=1;i<=n;++i) scanf("%s",a[i]+1);for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)if(a[i][j]=='*'){stx=i,sty=j;goto out;}out:for(int j=1;j<=m;++j)for(int i=1;i<=n;++i)if(a[i][j]=='X'){x=i,y=j;goto judge;}judge:if(stx==x&&sty<y){for(int j=1;j<=m;++j)for(int i=1;i<=n;++i)if(a[i][j]=='X'){x=i,y=j;goto mark;}mark:for(int i=y+1;i<=m;++i) a[x][i]='+';}else for(int i=1;i<y;++i) a[x][i]='+';bfs(stx,sty);for(int i=1;i<=m;++i) if(a[x][i]=='+'){up=f[x-1][i];if(i>1&&f[x-1][i-1]<up) up=f[x-1][i-1];if(i<m&&f[x-1][i+1]<up) up=f[x-1][i+1];down=f[x+1][i];if(i>1&&f[x+1][i-1]<down) down=f[x+1][i-1];if(i<m&&f[x+1][i+1]<down) down=f[x+1][i+1];if(up+down+2<ans) ans=up+down+2;}printf("%d\n",ans);return 0;
}

gmoj 6841. 【2020.11.5提高组模拟】淘淘蓝蓝之树林相关推荐

  1. gmoj 6860. 【2020.11.14提高组模拟】鬼渊传说

    题目 Time Limits: 1000 ms Memory Limits: 518400 KB 简要题意 给出一个网格图,每个格子有黑白二色,求有多少个子矩形满足将其挖出来后恰好有一个黑色四连通块且 ...

  2. 6848. 【2020.11.03提高组模拟】融入社会的计划

    Description Input Output 一行一个整数表示答案. upd:  无解输出-1. Sample Input Sample Input1 6 6 13 11 1 1 4 5 5 Sa ...

  3. 6846. 【2020.11.02提高组模拟】旅人1970

    Description Input Output Sample Input Sample Input1 25 4 4 1 2 3 2 1 1 1 2 Sample Output Sample Outp ...

  4. 【2020.11.30提高组模拟】剪辣椒(chilli)

    剪辣椒(chilli) 题目描述 在花园里劳累了一上午之后,你决定用自己种的干辣椒奖励自己. 你有n个辣椒,这些辣椒用n-1条绳子连接在一起,任意两个辣椒通过用若干个绳子相连,即形成一棵树. 你决定分 ...

  5. JZOJ6893. 【2020.11.25提高组模拟】小 T 与灵石(stone)题解

    这道题需要转化,换根和卡常. 首先将集合中的点拉出来,找它们的直径 不需要什么虚树,随便挑一个集合里的点为根,做一遍dfs,找最远点x(要在集合里),以x为根重复以上操作,找到最远点y,x-y就是题解 ...

  6. JZOJ6828. 【2020.10.25提高组模拟】幂

    Description TTT组数据,T≤1e5,n≤1e7T\le1e5,n\le1e7T≤1e5,n≤1e7 Solution 好家伙,最下面的数据范围居然是这样的: 直接以为卡特兰数乘上个组合数 ...

  7. 6810. 【2020.10.05提高组模拟】路哥

    Description Input Output Sample Input Sample Input1 3 1 1 1 1 1 2 2 3 Sample Input2 9 4 0 0 1 4 1 2 ...

  8. 【2020.12.03提高组模拟】袋鼠

    题目 题目描述 你知道吗?乌拉圭的人口有345.7万,同时,仅澳大利亚就有4700万只袋鼠. 袋鼠决定入侵乌拉圭.袋鼠们将在平原上布阵,平原被划分成 n×mn \times mn×m 的网格. 每个格 ...

  9. 第一届『Citric杯』NOIP提高组模拟赛 题解

    [官方题解]第一届『Citric杯』NOIP提高组模拟赛 题解 第一题 柠檬超市 这题是本次模拟赛的送分题.做法显然. 但是注意此题有一个陷阱: 注意W和C的规模都是10^9,所以如果直接用doubl ...

  10. NOIP2017提高组模拟赛4 (总结)

    NOIP2017提高组模拟赛4 (总结) 第一题 约数 设K是一个正整数,设X是K的约数,且X不等于1也不等于K. 加了X后,K的值就变大了,你可以重复上面的步骤.例如K= 4,我们可以用上面的规则产 ...

最新文章

  1. MFC接收ShellExecute多个参数
  2. JAVA中报错AbandonedObjectPool is used (org.apache.tomcat.dbcp.dbcp.AbandonedObjectPool@f70ee1)
  3. ArcGIS 9.2 Server Pack 5 蓄势待发
  4. 大数据量分页存储过程效率测试附代码
  5. 双重差分模型能做固定效应吗_互助问答第53期:控制时间效应、交互项等问题...
  6. 爬虫python入门_python爬虫入门教程有哪些?适合的只有这三个
  7. 微信或手机浏览器在线显示office文件(已測试ios、android)
  8. Qt之问题: Unknown module(s) in QT: multimedia
  9. EMOS1.6下的php支持GD库
  10. [转][职业导航]作为初涉销售的年轻人,你是否具备核心竞争力?
  11. win7安装office2016报错:无法找到入口
  12. RPL-UDP的cooja仿真过程
  13. mos 多路模拟电子开关_模拟开关与多路转换器
  14. c++ 递归算法求全排列
  15. html5 tooltip,HTML5 教程之CSS 提示工具(Tooltip)
  16. python-js逆向之AST语法树初学(一)
  17. cad中tk什么意思_原来CAD里的这些缩写是这个意思!终于搞懂了对象捕捉这个玩意儿...
  18. 匹配表情emoji 正则_js判断替换emoji表情?
  19. wish虚拟服务器,云服务器wish
  20. VC操作word和excel文件,查询与读写[依赖office环境]

热门文章

  1. 数据可视化 - 什么是数据可视化
  2. 前端css实现气泡框
  3. 银河麒麟V10下载安装使用体验(上)
  4. 揭密微信跳一跳小游戏那些外挂
  5. 【论文笔记】Don’t Stop Pretraining: Adapt Language Models to Domains and Tasks
  6. DPDK ip分片与重组的设计实现
  7. Ubuntu系统各种文件的颜色代表的意义
  8. STM32F103C8T6最小系统板原理图+PCB文件
  9. 第3章:混仿高级特性
  10. 以太坊存储项目Swarm (代币bzz)1.0 主网正式上线