P10265 [GESP样题 七级] 迷宫统计

记录165

#include<bits/stdc++.h>
using namespace std;
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n,m,cntC=0,cntG=0,t;// 来是come -> cntC ,去是GO -> cntG
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>t;
			if(i==m&&t==1) cntG++;
			if(j==m&&t==1) cntC++;
		}
	}
	cout<<cntG<<" "<<cntC<<" "<<cntG+cntC;
	return 0;
} 

题目传送门https://www.luogu.com.cn/problem/P10265


前言

我是一名专注信奥赛(GESP、CSP-J/S)的教练。

  • 如果你觉得这篇题解对你有帮助,欢迎点击关注我的CSDN账号,我会持续更新高质量算法解析。
  • 我深知算法思维的构建远比单纯通过题目更重要,本系列题解不局限于AC代码的堆砌,而是致力于拆解题目背后的逻辑链条与核心知识点
  • 备赛路上若遇瓶颈,欢迎随时评论或私信,我将甄选典型疑难问题,通过视频讲解或撰写专项文章的形式,为你提供深度答疑。

核心解题思路

  1. 读懂矩阵含义
    题目给出的邻接矩阵中,第 i 行第 j 列的数字 t 代表 i -> j 的连通性。

    • 如果 t == 1,说明 i 能到 j。
  2. 统计“去”的数量(出度)
    我们要找 m 号迷宫能直接到达 多少个迷宫。

    • 这对应矩阵的 第 m 行
    • 遍历第 m 行,统计有多少个 1
  3. 统计“来”的数量(入度)
    我们要找 有多少迷宫能直接到达 m 号迷宫。

    • 这对应矩阵的 第 m 列
    • 遍历第 m 列,统计有多少个 1
  4. 关于自身
    题目说“i 号迷宫总可以直接到达自身”,意味着矩阵对角线 a[i][i] 一定是 1。我们在统计行和列时,自然会把这个 1 算进去,完全符合题目“包含自身”的要求,无需特殊处理。


代码分块详细解释

1. 头文件与 IO 优化

#include<bits/stdc++.h>
using namespace std;
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
  • 详细分析n 最大为 1000,矩阵元素有 10^6 个。虽然 10^6 的 cin 通常能过,但加上 ios::sync_with_stdio(false); 和 cin.tie(0); 是处理大规模矩阵输入的标准操作,能确保不会因为 IO 瓶颈超时。

2. 变量定义与输入框架

	int n, m, cntC = 0, cntG = 0, t; // 来是come -> cntC ,去是GO -> cntG
	cin >> n >> m;
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= n; j++){
			cin >> t;
  • 详细分析
    • cntG (Go):记录 m 能到达多少个点(第 m 行的 1 的个数)。
    • cntC (Come):记录多少个点能到达 m(第 m 列的 1 的个数)。
    • 使用双重循环读取矩阵,用临时变量 t 接收当前读入的值,不需要开二维数组存整个矩阵,这是本题最大的优化点!空间复杂度从 O(n^2) 降到了 O(1)。

3. 核心逻辑:边读边统计

			if(i == m && t == 1) cntG++;
			if(j == m && t == 1) cntC++;
		}
	}
  • 详细分析:这是代码的灵魂,极其精简。
    • 判断出边:当行号 i 等于目标 m 且值为 1 时,说明 m -> j 连通,cntG++
    • 判断入边:当列号 j 等于目标 m 且值为 1 时,说明 i -> m 连通,cntC++
    • 注意:当 i == m && j == m 时(即读到对角线上的自身),两个 if 都会执行。这正好对应了题目中“m 能到达 m”和“m 能到达 m”各算一次,逻辑完美闭环。

4. 输出结果

	cout << cntG << " " << cntC << " " << cntG + cntC;
	return 0;
}
  • 详细分析:按题目要求,依次输出“去”的数量、“来”的数量、以及两者的总和。

 核心逻辑总结表

代码模块核心变量/操作精炼作用解决的痛点
空间优化单变量 t 接收边读边处理,不存矩阵避免开 1000×1000 数组,节省内存,缓存更友好
出度统计if(i==m && t==1)锁定第 m 行,统计 1 的个数解决“m 能直接到达多少个迷宫”的问题
入度统计if(j==m && t==1)锁定第 m 列,统计 1 的个数解决“多少个迷宫能直接到达 m”的问题
自身处理双重 if 自然包含对角线元素同时满足行、列条件无需额外判断 i==j,代码更简洁且逻辑正确
IO 加速ios::sync_with_stdio(false)关闭 C++ 与 C 流同步应对 10^6 级别的数据输入,防止 TLE

易错点提示

  1. 行列搞反i 是行(出发点),j 是列(到达点)。m 在行里是“去”,在列里是“来”。
  2. 自身重复计算:题目要求包含自身,且最后求和是 cntG + cntC,所以 m->m 被算两次是完全正确的,千万不要去重!
  3. 数据范围:n=1000 时,元素有 100 万个,必须用 int 或更快的读入,cin 加速后完全没问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值