E.七段码 2020蓝桥杯
考察:搜索
思路:
组合式枚举,然后check.可以用并查集检查是否为一条通路...很简单...但是我一开始想的是直接存储每个点到达的其他点然后字典序枚举路.这样会漏解比如c g f....
最后答案是80...蓝桥杯提交不了....
1 #include <iostream> 2 #include <cstring> 3 #include <vector> 4 using namespace std; 5 typedef long long LL; 6 const int N = 8; 7 int ans = 7,p[N]; 8 bool g[N][N]; 9 vector<int> v; 10 void init() 11 { 12 g[1][2] = g[2][1] = 1; g[1][6] = g[6][1] = 1; 13 g[2][7] = g[7][2] = 1; g[2][3] = g[3][2] = 1; 14 g[3][7] = g[7][3] = 1; g[3][4] = g[4][3] = 1; 15 g[4][5] = g[5][4] = 1; 16 g[5][7] = g[7][5] = 1; g[5][6] = g[6][5] = 1; 17 g[6][7] = g[7][6] = 1; 18 } 19 int findf(int x) 20 { 21 if(p[x]!=x) p[x] = findf(p[x]); 22 return p[x]; 23 } 24 void add(int a,int b) 25 { 26 int pa = findf(a),pb = findf(b); 27 if(pa==pb) return; 28 p[pa] = pb; 29 } 30 bool check() 31 { 32 for(int i=1;i<=7;i++) p[i] = i; 33 for(int i=0;i<(int)v.size();i++) 34 for(int j=0;j<(int)v.size();j++) 35 if(i!=j) 36 { 37 int a = v[i],b = v[j]; 38 if(g[a][b]) add(a,b); 39 } 40 int px = findf(v[0]); 41 for(int i=0;i<(int)v.size();i++) 42 if(px!=findf(v[i])) return false; 43 return true; 44 } 45 void dfs(int cnt,int sz,int idx) 46 { 47 if(cnt==sz) 48 { 49 if(check()) ans++; 50 return; 51 } 52 for(int i=idx;i<=7;i++) 53 { 54 v.push_back(i); 55 dfs(cnt+1,sz,i+1); 56 v.pop_back(); 57 } 58 } 59 int main() 60 { 61 init(); 62 for(int i=2;i<=7;i++) 63 dfs(0,i,1); 64 printf("%d\n",ans); 65 return 0; 66 }