b_lq_七段碼(二進位制列舉+連通性檢測)
阿新 • • 發佈:2020-10-18
求這個燈管的發光樣式種類,發光的部分需連在一起
思路
二進位制列舉+檢測連通,信誓旦旦地交了個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; }