L3-018 森森美图 (30 分)

2023-11-04

题目

题目链接

题解

BFS。


先看看样例咋出来的吧。

在这里插入图片描述

判断某个坐标属于起点终点连线的哪一侧的时候,我们采用是将点代入起点终点的两点式中根据正负值判断,两次bfs更新起点到终点的“距离”。

bfs每次扩展一个点,用起点到该点的“距离”更新其八个方向上的点的“距离”,如果八个方向上的点保存的“距离”被更新了,则入队,可以用这些点继续更新别的点,否则不要入队了,因为别的点已经由这些点更新过了,再加入个没变的“距离”还是不会有任何效果的,所以直接不入队,节约时间。

坑点:

  1. 注意不要重复统计起点和终点。(这个点因为我瞎眼,卡了也就将近俩小时吧)
  2. 注意x是轴是水平方向,y轴是竖直方向,所以列的变化方向为x轴变化方向,行的变化方向为y轴变化方向。我采用的方法是转置,因为还是觉得常见的保存方式做起来比较顺手(顺手:指debug两个半小时)

补充几点:

已知三角形三个顶点,计算三角形面积可以使用行列式:

在这里插入图片描述

当然,加上绝对值才算面积,也可以计算这个行列式的正负来判断属于直线的不同侧,展开再合并可以得到两点式的变形。

(实在懒得写Latex了,就截了个)


下面的程序中注释掉的代码部分为输出路径的语句,如果不理解可以输出看看。


我他妈服了,ljPTA题目描述真恶心,废话多而且描述的还不清楚,限制还贼多。


最后,感谢大佬的博客,如果不是大佬的博客,我可能永远都不知道样例是咋算出来的。

代码

#include<bits/stdc++.h>
#define PII pair<int, int>
using namespace std;

const double C = sqrt(2) - 1, MAX_DOUBLE = 1e50;
const int N = 110;

int n, m, flag;
int stx, tax, sty, tay;
//PII path[N][N];
double a[N][N], w[N][N];

double ans;

bool check (int x, int y) {
	// 判断是否为直线的flag一侧
	// 当(x,y)为终点时也要特殊判断返回的是可行,即属于flag一侧 
	double area =  (tax-stx) * (y-sty) - (tay-sty) * (x-stx);
	if (flag * area > 0 || (x == tax && y == tay)) return true;
	return false; 
}

void bfs () {
	// 初始化 
	for (int i = 0;i < n;i ++)
	for (int j = 0;j < m;j ++)
	w[i][j] = MAX_DOUBLE;
	
	queue <PII> q;
	q.push ({stx, sty});
	w[stx][sty] = a[stx][sty];
	
	while (q.size()) {
		PII t = q.front ();
		int x = t.first, y = t.second;
		q.pop ();
		
		for (int i = -1;i <= 1;i ++) // 枚举八个方向 
			for (int j = -1;j <= 1;j ++) {
				if (i == 0 && j == 0) continue; // 是(x,y)则continue 
				int tx = x+i, ty = y+j;
				if (tx < 0 || ty < 0 || tx >= n || ty >= m) continue; // 越界 
				if (!check (tx, ty)) continue; // 如果是终点或不是直线上的点则不会被continue掉 
				double tw = w[x][y] + a[tx][ty] + ((abs(i) && abs(j)) * C * (a[x][y] + a[tx][ty]));
				// 当为斜线时要加上额外的值 
				if (w[tx][ty] > tw) {
					if (tx != tax || ty != tay) q.push ({tx, ty});
					w[tx][ty] = tw;
//					path[tx][ty] = {x, y}; // 保存路径 
				}
			}
	}
}

//void printpath (int x, int y) { // 输出路径函数 
//	if (x == -1 || y == -1) return ;
//	printpath (path[x][y].first, path[x][y].second);
//	cout << x << ' ' << y << ' ' << a[x][y] << endl;
//}

int main()
{
	cin >> n >> m;
	for (int i = 0;i < n;i ++)
	for (int j = 0;j < m;j ++)
	cin >> a[i][j];

	// 转置一下 
	swap (n, m);
	for (int i = 0;i < max(n, m);i ++)
	for (int j = i+1;j < max(n, m);j ++)
	swap (a[i][j], a[j][i]);
	
	cin >> stx >> sty >> tax >> tay;  
	
	// 注释部分为路径输出 
//	memset (path, -1, sizeof path);
	flag = -1; bfs (); ans += w[tax][tay]; // 因为通过公式计算得到的值可能为正值或负值,通过flag控制属于直线的哪一侧 
//	cout << "----------" << endl; printpath (tax, tay); 
//	memset (path, -1, sizeof path);
	flag = 1; bfs (); ans += w[tax][tay];
//	cout << "----------" << endl; printpath (tax, tay);

	printf ("%.2lf", ans - a[stx][sty] - a[tax][tay]); // 一定要减去重复统计的起点和终点! 

	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

L3-018 森森美图 (30 分) 的相关文章

  • 将集合绑定到自定义控件属性

    我没有运气尝试将数据集合绑定到我的自定义控件的属性 我已经实现了该控件的字符串属性的机制 在此处提供了一些帮助 并期望集合类型同样简单 但是我无法让它再次工作 这是我的自定义控件视图
  • 数据模板绑定垃圾邮件输出窗口出现错误:找不到管理 FrameworkElemen

    我有问题 System Windows Data 错误 2 找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement BindingExpression 无路径 数据项 空 目标元素是 So
  • FileStream 构造函数和默认缓冲区大小

    我们有一个使用 NET 4 用 C 编写的日志记录类 我想添加一个构造函数参数 该参数可以选择设置文件选项 WriteThrough http msdn microsoft com en us library system io fileo
  • 在 Xamarin 中隐藏软键盘

    如何隐藏软键盘以便在聚焦时显示Entry在 Xamarin forms 便携式表单项目中 我假设我们必须为此编写特定于平台的渲染器 但以下内容不起作用 我创建自己的条目子类 public class MyExtendedEntry Entr
  • 我如何在 C# .NET(win7 手机)中使用“DataContractJsonSerializer”读入“嵌套”Json 文件?

    我有一个问题 如果我的 json 文件看起来像这样 Numbers 45387 Words 空间桶 我可以很好地阅读它 但是如果它看起来像这样 Main Numbers 45387 Words 空间桶 某事 数字 12345 单词 克兰斯基
  • 读取 C# 中的默认应用程序设置

    我的自定义网格控件有许多应用程序设置 在用户范围内 其中大部分是颜色设置 我有一个表单 用户可以在其中自定义这些颜色 并且我想添加一个用于恢复默认颜色设置的按钮 如何读取默认设置 例如 我有一个名为的用户设置CellBackgroundCo
  • 与 Qt 项目的静态链接

    我有一个在 Visual Studio 2010 Professional 中构建的 Qt 项目 但是 当我运行它 在调试或发布模式下 时 它会要求一些 Qt dll 如果我提供 dll 并将它们放入 System32 中 它就可以工作 但
  • 如何在 SqlDataReader.Read() 期间从死锁异常中恢复

    我的 NET 应用程序的事件日志显示 它在从 Sql Server 读取数据时偶尔会出现死锁 这种情况通常非常罕见 因为我们已经优化了查询以避免死锁 但有时仍然会发生 过去 我们在调用ExecuteReader函数在我们的SqlComman
  • 为什么这个没有特殊字符的正则表达式会匹配更长的字符串?

    我正在使用此方法来尝试查找匹配项 例如 Regex Match A2 TS OIL TS OIL RegexOptions IgnoreCase Success 我得到了真实的结果 我很困惑 我认为这应该返回 false 因为模式中没有特殊
  • ASP.Net Core 内容配置附件/内联

    我正在从 WebAPI 控制器返回一个文件 Content Disposition 标头值自动设置为 附件 例如 处置 附件 文件名 30956 pdf 文件名 UTF 8 30956 pdf 当它设置为附件时 浏览器将要求保存文件而不是打
  • 类的成员复制

    在学习 复制成员 概念时 书中给出了如下说法 此外 如果非静态成员是引用 const 或没有复制赋值的用户定义类型 则无法生成默认赋值 我不太明白这个声明到底想传达什么 或者说这个说法指的是哪一种场景 谢谢 该语句与编译器自动为您编写的类
  • 如何获取 QTableView 的标题列表?

    我有一个QTableView我的对话框中的对象 我需要访问该表的水平标题并将它们放入QStringList object 尽管进行了大量搜索 但我在 Qt 文档中找不到如何获取此标头列表 编辑 我发现的最接近的地方是this https w
  • C++ php 和静态库

    我创建了一个library a 其中包含 cpp 和 h 文件 其中包含很多类 嵌套类和方法 我想在 php 示例中包含这个静态库并尝试使用它 我想提一下 我是 php 新手 我已经在 test cpp 文件中测试了我的 libray a
  • 检查 RoutedEvent 是否有任何处理程序

    我有一个自定义 Button 类 当单击它时 打开特定窗口 它总是执行相同的操作 我添加了一个可以在按钮的 XAML 中分配的 Click 事件 就像常规按钮一样 当它被单击时 我想执行 Click 事件处理程序 如果已分配 否则我想执行默
  • 给出 5 个参数,但在终端中只得到 3 个参数

    我想将一个文件传递给一个c 程序 如果我在 IDE 中执行此操作 test string string lt test txt return argc 5 但在终端上我刚刚得到argc 3 看来 这是因为 什么是 lt 意思是 我正在使用
  • 无法在内存位置找到异常源:cudaError_enum

    我正在尝试确定 Microsoft C 异常的来源 test fft exe 中 0x770ab9bc 处的第一次机会异常 Microsoft C 异常 内存位置 0x016cf234 处的 cudaError enum 我的构建环境是 I
  • 运行选定的代码生成器时出错:“未将对象引用设置到对象的实例。”错误?

    我已经尝试了所有解决方案 例如修复 VS 2013 但没有用 当您通过右键单击控制器文件夹来创建控制器并添加控制器时 然后右键单击新创建的控制器的操作并选择添加视图 当我尝试创建视图时 就会发生这种情况 它不是一个新项目 而是一个现有项目
  • 是否有相当于 Clang/LLVM 的 .spec 文件,在哪里可以找到参考?

    The gcc驱动程序可以配置为使用特定的链接器 特定的选项和其他细节 例如覆盖系统头 specs files 当前 截至撰写本文时 GCC 版本 4 9 0 的手册此处描述了规范文件 https gcc gnu org onlinedoc
  • C# 中的 strstr() 等效项

    我有两个byte 我想找到第二个的第一次出现byte 在第一个byte 或其中的一个范围 我不想使用字符串来提高效率 翻译第一个byte to a string会效率低下 基本上我相信就是这样strstr 在 C 中做 最好的方法是什么 这
  • 更改 Windows Phone 系统托盘颜色

    有没有办法将 Windows Phone 上的系统托盘颜色从黑色更改为白色 我的应用程序有白色背景 所以我希望系统托盘也是白色的 您可以在页面 XAML 中执行此操作

随机推荐

  • Java应用CPU占用过高故障排除

    一 背景 最近测试反馈测试环境接口偶现有访问超时 然后APP提示是网络失败 看了一下测试环境的应用完全没啥问题 一直以为是网络问题 今天测试有反馈了 赶紧看了一下测试服务器 这次终于有症状了 CPU直接飙到300 了 尽然问题复现了 直接开
  • uboot内存操作命令

    uboot内存操作命令命令用于直接对DRAM进行读写操作 常用命令有md nm mm mw cp cmp 1 md 命令格式 md b w l address of objects b w l 分别代表byte 1Byte word 2By
  • java和python二进制文件不能直接读取的解决方案

    前一阵在做一个项目时 会用到java和python 上下游的关系 java写 python读 但是发现两者的二进制文件无法直接读取 后来发现是由于编码的原因 比如在写入int时 一个是从左到右开始编码 一个是从右到左 所以无法直接读取 因此
  • opengl读取网格数据绘制三维物体_交互式三维绘图库(WxGL)速览

    WxGL是一个基于PyOpenGL的三维数据可视化库 以wx为显示后端 提供Matplotlib风格的交互式应用模式 同时 也可以和wxPython无缝结合 在wx的窗体上绘制三维模型 WxGL提供了一套简洁易用 对用户友好的API 将Op
  • 大龄失业超过半年,人生一劫,如何过关?

    在倒闭潮 裁员潮不断侵袭之下 如今的职场主打的就是一个惨烈 前一阵 38岁985硕士失业几个月被迫送外卖 的新闻 曾引起了不小的震动 同样也引起了很多人的共鸣 今天就来聊聊职场上的恐怖故事 如果将大龄 失业 超过半年这三个关键信息组合在一起
  • python使用openpyxl读取excel文件里的超链接文字与URL

    可以使用openpyxl这个库 pip install openpyxl 读取URL的示例代码 import openpyxl wb openpyxl load workbook data 文件 xlsx 读取文件 main sheet w
  • 秒杀多线程第二篇 原子操作 Interlocked系列函数

    秒杀多线程第二篇 原子操作 Interlocked系列函数 上一篇 CreateThread与 beginthreadex本质区别 中讲到一个多线程报数功能 为了描述方便和代码简洁起见 我们可以只输出最后的报数结果来观察程序是否运行出错 这
  • 在socket中使用域名

    客户端中直接使用IP地址会有很大的弊端 一旦IP地址变化 IP地址会经常变动 客户端软件就会出现错误 而使用域名会方便很多 注册后的域名只要每年续费就永远属于自己的 更换IP地址时修改域名解析即可 不会影响软件的正常使用 关于域名注册 域名
  • vtk数据交互的两种方式之回调函数、vtkCommand

    参考博客 VTK交互之vtkCommand 阿兵 AI医疗的博客 CSDN博客 vtkcommand 一 观察者 命令模式 VTK中用的较多的设计模式是 观察者 命令模式 Observer Command 要实现数据交互 主要基于观察者 命
  • mysql8 zip安装_windows10+mysql8.0.zip安装

    准备 环境 Windows 10 一 安装 1 解压zip包到安装目录 比如我的安装目录是 D Program MySQL 2 配置文件 在Windows系统中 配置文件默认是安装目录下的 my ini 文件 部分配置需要在初始安装时配置
  • t_1链表

    双指针 其实这是第一次接触这种算法概念 之前数据结构课堂上学习到的链表是非常基础和入门的 稍微进阶点的还得自己找资料学习 找题目练习 双指针 Two Pointers 指的是在遍历元素的过程中 不是使用单个指针进行访问 而是使用两个指针进行
  • 【Kaggle】【Titanic】【AutoGluon】测试

    文章目录 安装 训练 预测 提交方式 Competition首页 Notebook首页 结果 Reference 安装 pip install autogluon 安装autogluon 训练 from autogluon tabular
  • 第17章 站点构建

    mini商城第17章 站点构建 一 课题 站点构建 二 回顾 1 Gateway限流 2 Nginx限流 3 Redis集群应用 4 缓存灾难处理 三 目标 1 Sentinel Sentinel介绍 Sentinel核心功能 Sentin
  • 深度学习之学习(3-3)YOLOV2

    参见 目标检测论文阅读 YOLOv2 知乎 二 更快更准 YOLOv2 2 1 简介 2017年 作者 Joseph Redmon 和 Ali Farhadi 在 YOLOv1 的基础上 进行了大量改进 提出了 YOLOv2 和 YOLO9
  • 少样本NER的方法

    论文 Few Shot Named Entity Recognition A Comprehensive Study 速看 微软 韩家炜课题组的全面调研 NER标注数据少 怎么办 论文总结了少样本ner的三种方法 方案1 原型方法 Prot
  • Qt应用程序设计(二):窗口与部件

    一 部件基类继承表 二 窗口部件QWidget 1 窗口与子部件 窗口部件 Widget 简称部件 是Qt中建立用户界面的主要元素 像主窗口 对话框 标签 按钮 文本输入框等都是窗口部件 这些部件可以接受用户输入 显示数据和状态信息 并且在
  • Qt中出现错误:Cannot find Makefile. Check your build settings.

    错误 Cannot find Makefile Check your build settings Error while building deploying project untitled1 kit Desktop Qt 5 14 1
  • __attribute__((visibility(“default“)))含义

    GCC的visibility属性用来控制 so文件的符号表 也就是控制外部能不能找到符号调用 比如函数 变量 模板 类等 符号表分静态的 symtab 和动态的 dynsym 一个对应链接视图另一个对应执行视图 设置为 hidden 符号将
  • 卷积神经网络中的即插即用模块

    卷积神经网络中的即插即用模块 是首发于GiantPandaCV公众号的电子书教程 由pprp总结并整理了常见的即插即用模块 可以分为注意力模块和其他模块 通过这篇电子书中的模块结合 从零开始学习YOLOv3 中的在YOLOv3模型中添加At
  • L3-018 森森美图 (30 分)

    题目 题目链接 题解 BFS 先看看样例咋出来的吧 判断某个坐标属于起点终点连线的哪一侧的时候 我们采用是将点代入起点终点的两点式中根据正负值判断 两次bfs更新起点到终点的 距离 bfs每次扩展一个点 用起点到该点的 距离 更新其八个方向