牛牛数星星

问题:

一闪一闪亮晶晶,满天都是小星星,牛牛晚上闲来无聊,便躺在床上数星星。

牛牛把星星图看成一个平面,左上角为原点(坐标为(1, 1))。现在有n颗星星,他给每颗星星都标上坐标(xi,yi),表示这颗星星在第x行,第y列。

现在,牛牛想问你m个问题,给你两个点的坐标(a1, b1)(a2,b2),表示一个矩形的左上角的点坐标和右下角的点坐标,请问在这个矩形内有多少颗星星(边界上的点也算是矩形内)。

解答:


分析得到不能暴力搜索,可能使得较高的复杂度,需要先求出某个矩形内的星星数量,对矩形数组更新,可以画图理解,之后按要求查出,有点回溯的感觉。

#include <iostream>
using namespace std;
const int maxn = 1000 + 5;
int m[maxn][maxn];
int num[maxn][maxn];
int n;
int t;
 
int main(void){
    cin>>n;
    int x,y;
 
    for(int i = 0;i < n;i++){
        cin>>x>>y;
        m[x][y]++;
    }
 
    for(int i = 0;i < maxn;i++)
        for(int j = 0;j < maxn;j++){
            num[i][j] = num[i-1][j] + num[i][j-1] + m[i][j] - num[i-1][j-1];
        }
 
    cin>>t;
    for(int i = 0;i <t;i++){
        int a1,b1,a2,b2;
        cin>>a1>>b1>>a2>>b2;
        cout<<num[a2][b2] - num[a1-1][b2] - num[a2][b1-1] + num[a1-1][b1-1]<<endl;
    }
    return 0;
}

 

### 蓝桥杯数星星题目解析 蓝桥杯竞赛中的“数星星”类题目通常涉及二维数组的操作以及简单的逻辑判断。这类问题的核心在于如何通过遍历矩阵来统计满足特定条件的元素数量。 #### 题目概述 假设有一个由字符组成的矩形网格,其中某些位置标记为“*”,表示一颗星星;其他位置为空白或其他符号。目标是编写程序计算该网格中共有多少颗独立的星星。“独立”的定义是指两颗相邻的星星(上下左右四个方向之一相连)应视为同一颗大星星的一部分[^1]。 此类问题可以采用深度优先搜索(DFS)或者广度优先搜索(BFS)算法解决。下面给出基于Python实现的一个通用解决方案: ```python def count_stars(grid): if not grid or not grid[0]: return 0 rows, cols = len(grid), len(grid[0]) visited = [[False]*cols for _ in range(rows)] def dfs(r, c): stack = [(r,c)] while stack: i,j=stack.pop() if (i<0 or j<0 or i>=rows or j>=cols or visited[i][j] or grid[i][j]!='*'): continue visited[i][j]=True directions=[(-1,0),(1,0),(0,-1),(0,1)] # 上下左右移动向量 for dr,dc in directions: ni,nj=i+dr,j+dc stack.append((ni,nj)) star_count=0 for r in range(rows): for c in range(cols): if grid[r][c]=='*' and not visited[r][c]: dfs(r,c) star_count+=1 return star_count ``` 上述代码片段实现了`count_stars()`函数,它接收一个二维列表作为输入参数,并返回整数值代表检测到的不同星星数目[^2]。 #### 关键点分析 - **初始化访问状态表**:创建了一个与原始网格大小相同的布尔型辅助表格 `visited[][]` ,用于记录哪些单元已经被处理过了。 - **递归/迭代机制**:利用栈结构模拟了非递归形式下的 DFS 过程,在每次发现新的未探索过的星体时启动一次完整的扫描操作直至完成整个连通区域的覆盖。 - **边界条件检查**:确保不会越界读取数据的同时也跳过了已经考察完毕的位置或是不符合当前需求的数据项(即不是‘ * ’的情况)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值