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);
}




源码直接下载地址: https://pan.quark.cn/s/95437fdf229e Intel I-219V网卡驱动是一款专门为Intel的I-219V千兆以太网控制器而研发的驱动程序,其主要作用在于保障在Ubuntu 16.04操作系统环境下的正常运作以及优化系统性能。Intel I-219V作为一款广泛应用的内置网络接口控制器(NIC),常被集成在台式机及笔记本电脑的主板上,负责提供高速的网络连接服务。Intel公司所提供的e1000e驱动是与此硬件相配套的开源驱动解决方案,其中版本3.3.5.3是专门针对该硬件设备的定制版本。此驱动包含了不可或缺的源代码部分,赋予开发者和系统管理者按照特定需求进行编译和定制的权限,从而能够适应多样化的系统配置或针对特定情形进行问题解决。源代码的可用性同样表明用户有能力依据Linux内核的更新情况来升级驱动,确保与最新技术标准的兼容性。在Ubuntu 16.04系统中成功编译的驱动意味着它已经通过了严苛的测试流程,并能够与该版本的Linux内核实现良好兼容。Ubuntu 16.04,其代号为Xenial Xerus,是一个长期支持(LTS)的版本,因此对于那些追求系统稳定性和安全保障的用户群体而言具有特殊的意义。驱动程序的兼容性保障了I-219V网卡能够在该系统平台上实现无缝运行,提供稳定可靠的网络连接,这既包括局域网(LAN)的连接,也可能涵盖通过Wi-Fi桥接实现的无线网络连接。驱动程序的核心职责涵盖了网络接口的初始化与管理、数据包的接收与发送处理,以及错误检测与纠正功能的执行。在Linux操作系统架构中,驱动通常以模块的形式加载至内核之中,这种设计允许在非必要时期进行卸载操作,以此来有效节省系统资源。e1000e驱...
内容概要:本文围绕基于共识的捆绑算法(CBBA)在多智能体系统中的多任务分配问题展开研究,重点应用于远程太空船交会与维修的相对轨道操作(RPO)规划。通过Matlab代码实现了CBBA算法,系统地解决了多个航天器在复杂空间环境下协同执行多目标任务时的任务分配、路径规划与动态协商问题。研究详细展示了算法在任务分解、竞标机制、共识达成及冲突消解等方面的核心逻辑,验证了其在分布式决策、通信受限条件下的高效性与鲁棒性,并结合航天工程实际背景突出了算法的应用价值。该资源不仅提供完整的仿真代码,还包含详细的流程解析,有助于深入理解多智能体协同机制的设计原理。; 适合人群:具备控制理论、航天器动力学、多智能体系统或分布式优化背景的研究生、科研人员及航空航天领域工程技术人员,熟练掌握Matlab编程者尤佳。; 使用场景及目标:①应用于在轨服务、空间碎片清除、多航天器编队飞行、星座维护等多智能体协同任务的任务分配与规划;②为研究人员提供CBBA算法的实现范例,支撑其开展分布式任务规划算法的改进与扩展研究;③作为教学案例用于高级课程中讲解多智能体协同决策机制。; 阅读建议:建议结合Matlab代码逐模块分析算法实现过程,重点关注任务打包、竞标更新、共识收敛等关键环节,可尝试引入通信延迟、故障容错或障碍规避机制以进一步提升算法实用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值