当前位置: 首页 > article >正文

洛谷 AT_abc275_c [ABC275C] Counting Squares 题解

大致题意

求以 # 为顶点的正方形个数。

思路分析

一道水黄。

首先我们可以看到题目范围非常小,仅仅只是一个 9 × 9 9\times9 9×9 的字符矩阵,而且还给了 2 2 2 秒的时间,所以是完全可以暴力的。

可以用 set 存储每个 # 号的位置,枚举正方形的两个点 i i i j j j,设另外两个点为 n n n m m m,容易得到 n x = i x + i y − j y , n y = i y − i x + j x n_x=i_x+i_y-j_y,n_y=i_y-i_x+j_x nx=ix+iyjy,ny=iyix+jx m x = j x + i y − j y , m y = j y − i x + j x m_x=j_x+i_y-j_y,m_y=j_y-i_x+j_x mx=jx+iyjy,my=jyix+jx 四个公式求出 n n n m m m 的坐标,在判断是否是 # 即可。

需要注意的是,由于每个角在枚举时都会算一遍,所以答案要乘 1 4 \frac{1}{4} 41

Code

代码如下:

#include <iostream>
#include <set>
using namespace std;
signed main() {
	ios::sync_with_stdio(false), cin.tie(), cout.tie();
	char ch;
	int ans = 0;
	set <pair<int, int>> s;
	for (int i = 1; i <= 9; ++i)
		for (int j = 1; j <= 9; ++j) {
			cin >> ch;
			if (ch == '#') s.insert({i,j});//初始化 s
		}
	for (pair <int, int> i : s)
		for (pair <int, int> j : s)
			if (i != j) {//如果不是同一个点才进行操作
				int x = i.second - j.second, y = i.first - j.first;
				if (s.find({i.first + x, i.second - y}) != s.end() && s.find({j.first + x, j.second - y}) != s.end()) ++ans;//判断,累加答案
			}
	cout << ans / 4;//答案要除以 4
	return 0;
}

http://www.kler.cn/a/322255.html

相关文章:

  • linux之调度管理(9)-SMP cpu hotplug
  • 小米路由器用外网域名访问管理界面
  • 2024年11月19日Github流行趋势
  • C 语言标准库 - <stdlib.h>
  • docker minio修改时区问题记录
  • 集群聊天服务器(11)客户端开发
  • 滚雪球学SpringCloud[9.1讲]:Docker与容器化详解
  • C++简单缓冲区类设计
  • [数据结构] 二叉树题目 (二)
  • AI智能时代:哪款编程工具让你的工作效率翻倍?
  • C++(9.25)
  • mysql笔记—sql性能分析
  • C#的结构体(Struct)应用示例
  • BUG——IMX6ULL编译正点原子Linux内核报错
  • QMT如何获取股票基本信息?如上市时间、退市时间、代码、名称、是否是ST等。QMT量化软件支持!
  • 基于SSM+小程序的医院挂号登录管理系统(医院4)(源码+sql脚本+视频导入教程+文档)
  • 一六九、go使用泛型封装一个可以应用于任何字段的模糊匹配
  • 【C/C++】速通涉及string类的经典编程题
  • Redis的数据类型和编码方式
  • uniapp实现图片上下浮动效果
  • 多速率信号处理-半带滤波器
  • 【漏洞复现】灵当CRM multipleUpload.php接口处存在文件上传漏洞
  • 高通Android 12 push framework.jar和service.jar
  • VMware Tools安装——VMware Tools是灰色的,不能安装, (不带图形化界面的虚拟机,只有命令行的模式!!!)
  • 【网络底层原理】I/O多路复用技术select、poll和epoll详解与比较
  • uniapp微信小程序遮罩层u-popup禁止底层穿透