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;
}
好吧,这本是一道拉开差距的题目,然儿在我即将收入囊中时,它...