Artwork Gym - 101550A (并查集)

本文探讨了一个关于涂色后白色区域分割的问题,通过并查集算法解决区域合并计数难题,提供了完整的代码实现。

题目

https://cn.vjudge.net/problem/Gym-101550A

题意

问你没涂一次,白块分成多少份

思路

先都涂完,然后到这删除,没删除一块看合并的多少块

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e3+10;
int mp[maxn][maxn];
int n,m,q;
int tx[4] = {0,0,1,-1};
int ty[4] = {1,-1,0,0};
int a[maxn*maxn];
int ans[maxn*10],anss;
int top;
int vis[maxn][maxn];

struct node
{
    int x1,x2,y1,y2;
    int x,y;
}qu[maxn*10];

int fin(int x)
{
    return a[x]==x?x:a[x]=fin(a[x]);
}

int get(int x,int y)
{
    return (x-1)*m +y;
}

void tu(int x)
{
    int x1 = qu[x].x1,x2 = qu[x].x2,y1 = qu[x].y1,y2 = qu[x].y2;
    if(x1 == x2)
    {
        for(int i = min(y1,y2);i <= max(y1,y2);i++)
        {
            mp[x1][i]++;
        }
    }
    else
    {
        for(int i = min(x1,x2);i <= max(x1,x2);i++)
        {
            mp[i][y1]++;
        }
    }
}

int ok(int x,int y)
{
    if(x<1||x>n||y<1||y>m) return 0;
    if(mp[x][y]) return 0;
    if(vis[x][y]) return 0;
    return 1;
}
void bfs(int sx,int sy,int fx)
{
    node u,v;
    u.x = sx,u.y = sy;
    vis[u.x][u.y] = 1;
    queue<node> q;
    q.push(u);
    while(!q.empty())
    {
        u = q.front();
        q.pop();
        for(int i = 0;i < 4;i++)
        {
            int dx = u.x + tx[i];
            int dy = u.y + ty[i];
            if(ok(dx,dy))
            {
                v.x = dx,v.y = dy;
                vis[v.x][v.y] = 1;
                q.push(v);
                int fy = get(dx,dy);
                a[fy] = fx;
            }
        }
    }
}

int okk(int x,int y)
{
    if(x<1||x>n||y<1||y>m) return 0;
    if(mp[x][y]) return 0;
    return 1;
}
int okkk(int x,int y)
{
    if(mp[x][y] > 0) return 1;
    return 0;
}
void shan(int id)
{
    int x1 = qu[id].x1,x2 = qu[id].x2,y1 = qu[id].y1,y2 = qu[id].y2;
    int f = 0;
    int fx,fy;
    if(x1 == x2)
    {
        for(int i = min(y1,y2);i <= max(y1,y2);i++)
        {
            int x = x1,y = i;
            mp[x][y]--;
            if(okkk(x,y)) continue;
            fx = fin(get(x,y));
            anss++;
            f = 1;
            for(int j = 0;j < 4;j++)
            {
                int dx = x + tx[j];
                int dy = y + ty[j];
                if(okk(dx,dy))
                {
                    int fy = fin(get(dx,dy));
                    if(fx != fy)
                    {
                        a[fy] = fx;
                        anss--;
                    }
                }
            }
        }
    }
    else
    {
        for(int i = min(x1,x2);i <= max(x1,x2);i++)
        {
            int x = i,y = y1;
            mp[x][y]--;
            if(okkk(x,y)) continue;
            fx = fin(get(x,y));
            anss++;
            f = 1;
            for(int j = 0;j < 4;j++)
            {
                int dx = x + tx[j];
                int dy = y + ty[j];
                if(okk(dx,dy))
                {
                    int fy = fin(get(dx,dy));
                    if(fx != fy)
                    {
                        a[fy] = fx;
                        anss--;
                    }
                }
            }
        }

    }
}
int main()
{
    scanf("%d%d%d",&n,&m,&q);
    for(int i = 1;i <= n*m;i++)
    {
        a[i] = i;
    }

    for(int i = 1;i <= q;i++)
    {
        scanf("%d%d%d%d",&qu[i].x1,&qu[i].y1,&qu[i].x2,&qu[i].y2);
    }

    for(int i = 1;i <= q;i++)
    {
        tu(i);
    }
    top = 0;
    for(int i = 1;i <= n;i++)
    {
        for(int j = 1;j <= m;j++)
        {
            if(mp[i][j] == 0&&vis[i][j] == 0)
            {
                top++;
                int fx = get(i,j);
                bfs(i,j,fx);
            }
        }
    }

    anss = top;
    top = n*m+1;
    for(int i = q;i >= 1;i--)
    {
        ans[i] = anss;
        shan(i);
    }
    for(int i = 1;i <= q;i++)
    {
        printf("%d\n",ans[i]);
    }
    return 0;
}

 

【四轴飞行器】非线性三自由度四轴飞行器模拟器研究(Matlab代码实现)内容概要:本文围绕非线性三自由度四轴飞行器模拟器的研究展开,重点介绍基于Matlab代码实现的四轴飞行器动力学建模与仿真方法。研究构建了考虑非线性特性的飞行器数学模型,涵盖姿态动力学与运动学方程,实现了三自由度(滚转、俯仰、偏航)的精确模拟。文中详细阐述了系统建模过程、控制算法设计思路及仿真结果分析,帮助读者深入理解四轴飞行器的飞行动力学特性与控制机制;同时,该模拟器可用于算法验证、控制器设计与教学实验。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的高校学生、科研人员及无人机相关领域的工程技术人员,尤其适合从事飞行器建模、控制算法开发的研究生和初级研究人员。; 使用场景及目标:①用于四轴飞行器非线性动力学特性的学习与仿真验证;②作为控制器(如PID、LQR、MPC等)设计与测试的仿真平台;③支持无人机控制系统教学与科研项目开发,提升对姿态控制与系统仿真的理解。; 阅读建议:建议读者结合Matlab代码逐模块分析,重点关注动力学方程的推导与实现方式,动手运行并调试仿真程序,以加深对飞行器姿态控制过程的理解。同时可扩展为六自由度模型或加入外部干扰以增强仿真真实性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值