SGU 001

本文介绍了一种解决多米诺骨牌排列问题的算法,通过构造图并寻找欧拉路径来确保每个多米诺骨牌的相邻数字相等。详细展示了如何使用邻接表表示图结构,并实现深度优先搜索算法来找到有效的排列方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

N个多米诺骨牌,每个骨牌左右两侧分别有一个0~6的整数(骨牌可以旋转以调换其左右两数),求一种把这些骨牌从左到右排列的方案,使得所有相邻的两数字相等(即左边骨牌右侧的数字等于右边骨牌左侧的数字)。

解法:

求欧拉路径,注意判断欧拉路径存不存在.

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <cassert>
using namespace std ;

const int N = 1e2+11 ;

struct Edge {
    int next, to ;
    Edge(){}
    Edge(int a , int b):next(a) , to(b){}
};

int head[N] ; Edge err[N*10] ; int nedge ;
bool vis[N*10] ;
int degree[10] ; int fa[10] ;
int site[N][2] ;
int ans[N][3] ;
vector<int> stk ;
int n ;

void add_edge(int a , int b) {
    err[++nedge] = Edge(head[a] , b) ;
    vis[nedge] = false ;
    head[a] = nedge ;
    err[++nedge] = Edge(head[b] , a) ;
    vis[nedge] = false ;
    head[b] = nedge ;
}

int find(int x) {
    if(fa[x] != x) fa[x] = find(fa[x]) ;
    return fa[x] ;
}

void dfs(int u) {
    for(int i = head[u] ; i != -1 ; i = err[i].next) {
        int v = err[i].to ;
        if(vis[i] == false) {
            vis[i] = vis[i^1] = true ;
            dfs(v) ;
        }
    }
    stk.push_back(u) ;
}

int main() {
    //freopen("data.in" ,"r", stdin) ;
    while(scanf("%d" , &n)==1) {
        memset(head , -1 , sizeof(head)) ; nedge = -1 ;
        memset(degree , 0 , sizeof(degree)) ;
        for(int i = 0 ; i <= 6 ; ++i) fa[i] = i ;
        int a , b ;
        int s1 = 0 , s2 = 0 ;
        for(int i = 1 ; i <= n ; ++i) {
            scanf("%d %d" , &a ,&b) ;
            site[i][0] = a , site[i][1] = b ;
            add_edge(i , n+a+1) ;
            add_edge(i , n+b+1) ;
            //注意a和b相等的时候
            if(degree[a] == 0) ++s1 ;
            ++degree[a] ;
            if(degree[b] == 0) ++s1 ;
            ++degree[b] ;
            int a1 = find(a) ;
            int b1 = find(b) ;
            if(a1 != b1) ++s2 , fa[a1] = b1 ;
        }
        if(s2+1 != s1) {
            printf("No solution\n") ;
            continue ;
        }
        int ss = 0 , start = 0 ;
        for(int i = 0 ; i <= 6 ; ++i) if(degree[i]%2) ++ss , start = i ;
        if(start == 0 && degree[0] == 0) for(int i = 1 ; i <= 6 ; ++i) if(degree[i] > 0) start = i ;
        if(!(ss == 2 || ss == 0)) {
            printf("No solution\n") ;
            continue ;
        }
        stk.clear() ;
        dfs(start+n+1) ;
        ss = 0 ;
        for(int i = 1 ; i < stk.size() ; i += 2) {
            int lef = stk[i-1]-n-1 , rig = stk[i+1]-n-1 ;
            ++ss ;
            ans[ss][0] = lef , ans[ss][1] = rig , ans[ss][2] = stk[i] ;
        }
        for(int i = 1 ; i <= n ; ++i) {
            printf("%d ", ans[i][2]) ;
            int x = ans[i][2] ;
            if(ans[i][0] == site[x][0] && ans[i][1] == site[x][1]) {
                printf("+\n") ;
            }else {
                printf("-\n") ;
            }
        }
    }
}
内容概要:本文探讨了在MATLAB/SimuLink环境中进行三相STATCOM(静态同步补偿器)无功补偿的技术方法及其仿真过程。首先介绍了STATCOM作为无功功率补偿装置的工作原理,即通过调节交流电压的幅值和相位来实现对无功功率的有效管理。接着详细描述了在MATLAB/SimuLink平台下构建三相STATCOM仿真模型的具体步骤,包括创建新模型、添加电源和负载、搭建主电路、加入控制模块以及完成整个电路的连接。然后阐述了如何通过对STATCOM输出电压和电流的精确调控达到无功补偿的目的,并展示了具体的仿真结果分析方法,如读取仿真数据、提取关键参数、绘制无功功率变化曲线等。最后指出,这种技术可以显著提升电力系统的稳定性与电能质量,展望了STATCOM在未来的发展潜力。 适合人群:电气工程专业学生、从事电力系统相关工作的技术人员、希望深入了解无功补偿技术的研究人员。 使用场景及目标:适用于想要掌握MATLAB/SimuLink软件操作技能的人群,特别是那些专注于电力电子领域的从业者;旨在帮助他们学会建立复杂的电力系统仿真模型,以便更好地理解STATCOM的工作机制,进而优化实际项目中的无功补偿方案。 其他说明:文中提供的实例代码可以帮助读者直观地了解如何从零开始构建一个完整的三相STATCOM仿真环境,并通过图形化的方式展示无功补偿的效果,便于进一步的学习与研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值