ycb惹女朋友生气了

          话说上题中,ycb刚在博知楼饮水机排完队打水,女朋友来电话说也想喝水,让ycb去接水,ycb为了方便就要把自己的水端去给女朋友,可谁知刚走到女朋友跟前,不小心将水全部洒在了地上(如果瓷砖上有水,则水都正好覆盖整块瓷砖,不考虑瓷砖之间的缝隙),ycb的女朋友很生气,对ycb说:”你要是数不清现在教室里有多少个水湾咱俩就分手好了!”。ycb数学不太好,他比较头疼这件事,现在需要你的帮助.

输入第一行包括两个整数n,m.表示教室的长,宽. (1<=n,m<=1000);
第二行到n+1行每行m个字符表示有m块瓷砖,’*’表示瓷砖上有水,‘.’表示没水.

只有一个整数,输出水湾的个数.(若两块瓷砖都有水并且瓷砖之间有一条公共边,则算一个水湾)。

2 2
.*
*.
2
3 3
.*.
***
.*.
1
这个题目可以用深搜,也可以用广搜,先用深搜:
先显示我代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<queue>
using namespace std;
char ch[1001][1001];
int book[1001][1001];
int flash[1001][1001];
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0} };
int ans;
int n,m;
void dfs(int x,int y)
{
    int tx,ty;
    for(int i=0;i<4;i++)
    {
        tx=x+dir[i][0];
        ty=y+dir[i][1];
        if(tx<0||tx>n-1||ty<0||ty>m-1)
            continue;
        if(book[tx][ty]==0&&ch[tx][ty]=='*')
        {
            book[tx][ty]=1;
            flash[tx][ty]=1;
            dfs(tx,ty);
        }
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    getchar();
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            scanf("%c",&ch[i][j]);
        }
        getchar();
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            if(ch[i][j]=='*'&&flash[i][j]==0)
            {
                ans++;
                book[i][j]=1;
                flash[i][j]=1;
                dfs(i,j);
            }
        }
    }
    printf("%d\n",ans);
}
这个深搜用到着色法的原理,即在二维数组中检验相连的瓷砖时。
下面是我刚开始在dfs中使用的普通代码,这个地方导致我TLE
void dfs(int x,int y)
{
    int tx,ty;
    if(ch[x][y]=='.')
        return;
    for(int i=0;i<4;i++)
    {
        tx=x+dir[i][0];
        ty=y+dir[i][1];
        if(tx<0||tx>n-1||ty<0||ty>m-1)
            continue;
        if(book[tx][ty]==0&&ch[tx][ty]=='*')
        {
            book[tx][ty]=1;
            flash[tx][ty]=1;
            dfs(tx,ty);
            book[tx][ty]=0;
        }
    }
}
这种写法使得在dfs中多了没有用的return,使得时间超时,但是在第一种代码中,当检验完全部之后就会自己结束函数
。
注意加记住:以后再遇到连体问题并且想使用dfs时,一定要记住在里面不要加多余的return条件和book回溯条件,因为
这些条件他自己会完成。

现在奉献上雨神的代码(也是深搜,找出了我的错误)
*#include <stdio.h>
#include <string.h>

int e[1001][1001];
int n,m,sum;

void dfs(int x,int y);

int main()
{
    int i,j;
    char a[1001];
    char ch;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        ch=getchar();
        for(i=1;i<=n;i++)
        {
            scanf("%s",a);
            for(j=1;j<=m;j++)
            {
                if(a[j-1]=='.')
                {
                    e[i][j]=0;//meishui
                }
                else
                {
                    e[i][j]=1;
                }
            }
            ch=getchar();
        }
        sum=0;
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=m;j++)
            {
                if(e[i][j]==1)
                {
                    sum++;
                    dfs(i,j);
                }
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}

void dfs(int x,int y)
{
    int next[4][2]={0,-1,-1,0,0,1,1,0};
    int i,j,tx,ty;
    for(i=0;i<4;i++)
    {
        tx=x+next[i][0];
        ty=y+next[i][1];
        if(tx<1||tx>n||ty<1||ty>m) continue;
        if(e[tx][ty]==1)
        {
            e[tx][ty]=-sum;
            dfs(tx,ty);
        }
    }
    return;
}

是不是比我的简单,是的,他的想法是,先把字符串二维数组转换成int型数组,然后在dfs的时候,当检验过该点的
时候,马上改变该点的值,那么下一次的时候就知道该点走过了,我的想法是另外开辟一个二维数组,实现和book一样
的作用,这样就知道该点在原来检验过了,反正自己习惯吧,不过我也要练练。




另外,考试的时候我还想到了广度优先搜索,
但是广搜还有一个地方 没弄好,就是两个的交点处,不知道怎么弄.

就是相当于找小岛的个数,每次是1.


#include<stdio.h>
#include<string.h>
#include<math.h>
#include<queue>
using namespace std;

int ans;
char ch[1001][1001];
int book[1001][1001];
int dir[4][2]={0,1,1,0,-1,0,0,-1};
struct stu
{
    int x;
    int y;
}now,ne;
int bfs(int x,int y)
{
    queue<stu>Q;
    now.x=x;
    now.y=y;
    Q.push(now);
    while(!Q.empty())
    {
        now=Q.front();
        Q.pop();
        for(int i=0;i<4;i++)
        {
            ne.x=now.x+dir[i][0];
            ne.y=now.y+dir[i][1];
            if(book[ne.x][ne.y]==0&&ch[ne.x][ne.y]=='*')
            {
                book[ne.x][ne.y]=1;
                Q.push(ne);
            }
        }
    }
    return 1;
}
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    getchar();
    for(int i=0;i<n;i++)
    {
        scanf("%s",ch[i]);
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            if(ch[i][j]=='*'&&book[i][j]==0)
                ans+=bfs(i,j);
        }
    }
    printf("%d\n",ans);
}




### YCB Video 数据集概述 YCB Video 数据集是一个广泛应用于计算机视觉领域中的物体识别和姿态估计的数据集[^5]。该数据集由雅各布斯大学(Jacobs University)、卡耐基梅隆大学(Carnegie Mellon University)以及英特尔实验室合作开发,旨在提供一个标准化的测试平台来评估机器人感知算法的效果。 #### 数据集特点 YCB Video 数据集包含了超过13万帧视频序列,这些序列覆盖了92种日常物品的不同视角、光照条件和背景环境下的图像采集过程[^5]。每一段视频都经过精心设计,确保能够捕捉到目标物的各种状态变化情况,比如旋转角度调整或者部分遮挡现象的发生等情形。此外,为了便于研究者们开展更深入的研究工作,在发布版本当中还附带了一些额外资源: - **精确标注**:每一帧都有详细的bounding box位置信息以及对应的6D位姿参数; - **多种传感器输入**:除了RGB图片之外,还包括深度图(Depth Map),这使得基于点云处理的方法也能得到充分验证; - **真实世界场景重现**:通过模拟实际生活中的摆放方式构建拍摄环境,从而提高模型泛化能力至复杂环境下表现水平。 ```python import numpy as np from ycb_video_dataset import YCBVideoDataset # 假设存在这样的库用于加载数据集 dataset = YCBVideoDataset(root_dir='/path/to/ycb/video/dataset') for i in range(len(dataset)): rgb_image, depth_image, labels = dataset[i] print(f"Frame {i}: RGB shape={rgb_image.shape}, Depth shape={depth_image.shape}") ``` 以上代码片段展示了如何利用Python脚本读取并操作来自YCB Video Dataset的部分内容样本。 #### 应用方向 由于其丰富的特性,YCB Video Dataset被频繁运用于以下几个方面: - 物体检测与分类; - 实时六自由度(6DoF)姿态跟踪; - 表面法线估算; - 场景理解. 它不仅促进了学术界对于三维重建技术进步的关注程度提升,同时也为企业级产品原型快速迭代提供了坚实基础支持.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值