信息学奥赛一本通编程启蒙<例 65.3> 细胞个数

题目描述

DFS 做法书里有写, 这里不再贴出代码

BFS 做法: 手写队列

代码示例

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1001;
char a[maxn][maxn]; // 存储元素, 以字符存储
int vis[maxn][maxn]; // 记录元素是否被访问
int n, m;
int d[4][2] = {{-1, 0},{1,0},{0,-1},{0,1}}; // 方向数组
struct node
{
    int x;
    int y;
}q[maxn];  // 结构体队列
void bfs(int x, int y)
{
    int head = 1; int tail = 1;
    q[tail].x = x;
    q[tail].y = y; // 当前点入列
    tail ++; // 队尾指针++
    while(head < tail) // 队列不为空
    {
        int x0 = q[head].x;
        int y0 = q[head].y;
        vis[x0][y0] = 1;  // 队首元素访问标记
        for(int i = 0; i < 4; i++) // 访问四个方向的邻居元素
        {
            int xn = x0 + d[i][0];
            int yn = y0 + d[i][1];
            if(xn >= 0 && xn < n && yn >= 0 && yn < m && a[xn][yn] != '0' && vis[xn][yn] != 1 )
            {
                q[tail].x = xn;  // 满足条件入列
                q[tail].y = yn;
                vis[xn][yn] = 1; // 入列元素标记为已访问
                tail ++; // 队尾指针后移
            }
        }
        head ++; // 队首出列
    }
}
int main()
{
    cin >> n >> m;
    int cnt = 0; // 统计个数
    memset(vis, 0, sizeof(vis)); // 访问标记清零
    for (int i = 0; i < n; i ++)
        cin >> a[i]; // 每一行作为一个字符列表存入
    for(int i = 0; i < n; i++)
        for(int j = 0; j < m; j++)    
        {
            if(a[i][j] != '0' && !vis[i][j]) // 当前元素不是数字 0 且未被访问
            {
                cnt ++;
                bfs(i, j); //以当前点为起点进行广搜
            }
        }
    cout << cnt ; // 输出结果
    return 0;
}

BFS 有固定模板, 理解记背

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是修改后的代码: ```c++ #include <iostream> #include <cstring> using namespace std; class Person { public: Person(char nameV[], bool sexV, int ageV, float heightV, float weightV) { cout << "我知道怎么设置人的属性,我已完成!" << endl; strncpy(name, nameV, sizeof(name)); // 姓名 sex = sexV; // 性别 age = ageV; // 年龄 height = heightV; // 身高 weight = weightV; // 体重 } void print() { cout << "我是一个人,我的属性值为:" << name << "," << sex << "," << age << "," << height << "," << weight << endl; } void eat(char obj[]) { cout << "我是一个人" << name << ",我正在吃:" << obj << endl; } void sleep() { cout << "我是一个人" << name << ",我正在睡觉。" << endl; } private: char name[20]; // 姓名 bool sex; // 性别 int age; // 年龄 float height; // 身高 float weight; // 体重 }; int main() { // 设置张三("张三"1,18,180.5,65.3)的属性 Person p1("张三", true, 18, 180.5, 65.3); p1.eat("西瓜"); p1.sleep(); p1.print(); // 设置李四("李四",0,16,165,46.5)的属性 Person p2("李四", false, 16, 165, 46.5); p2.print(); return 0; } ``` 修改说明: 1. 将类的属性设置函数 setValue() 改为类的构造函数 Person(),用于在对象创建时初始化对象的属性值。 2. 删除了类的 sleep() 和 eat() 函数中的输出,使输出更加符合人类的实际行为。 3. 将 main() 函数中的 p1 和 p2 对象的创建方式改为调用类的构造函数 Person()。 4. 在类的属性和函数声明后面加上了 private 和 public 关键字,用于指定属性或函数的访问权限。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值