b_lq_七段码(二进制枚举+连通性检测)


求这个灯管的发光样式种类,发光的部分需连在一起

思路
二进制枚举+检测连通,信誓旦旦地交了个69;事后发现建图的时候少建了一条边,分没了

#include<bits/stdc++.h>
using namespace std;
const int N=8;
int vis[N], light[N];
vector<int> g[N];
void dfs(int u) {
    vis[u]=1;
    for (int v : g[u]) if (!vis[v] && light[v])
        dfs(v);
}
bool valid(int sta) {
    string s;
    while (sta || s.size()<7) {
        s=to_string(sta&1)+s;
        sta>>=1;
    }
    memset(light, false, sizeof light);
    int start=0, n=s.size();
    for (int i=0; i<n; i++) if (s[i]=='1')
        start=n-i, light[start]=1;
    memset(vis,false,sizeof vis);
    dfs(start);
    for (int i=1; i<=7; i++) if (light[i] && !vis[i]) return false;
    return true;
}
void init_G() {
    g[1].push_back(2),g[2].push_back(1);    
    g[2].push_back(3),g[3].push_back(2);    
    g[3].push_back(4),g[4].push_back(3);    
    g[4].push_back(5),g[5].push_back(4);
    g[5].push_back(6),g[6].push_back(5);
    g[6].push_back(7),g[7].push_back(6);
    
    g[2].push_back(7),g[7].push_back(2);    
    g[3].push_back(7),g[7].push_back(3); 
    g[5].push_back(7),g[7].push_back(5);     
    g[1].push_back(6),g[6].push_back(1); //对,就缺了这条边
}
int main() {
    std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    init_G();
    int tot=1<<7, ans=0;
    for (int i=1; i<tot; i++) if (valid(i))
        ans++;
    cout<<ans;
    return 0;
}

好吧,这本是一道拉开差距的题目,然儿在我即将收入囊中时,它...

原文地址:https://www.cnblogs.com/wdt1/p/13835562.html