AcWing 0000. 七段码
原题链接
简单
作者:
elpo
,
2021-04-17 22:49:52
,
所有人可见
,
阅读 278
七段码
#include<iostream>
#include<unordered_set>
using namespace std;
int st[10],v[10],p[10],ans;
int vi[10][10],rr;
unordered_set<int>h;
int find(int x){
if(p[x]!=x)return p[x]=find(p[x]);
return p[x];
}
void in(){
vi[1][4]=vi[1][2]=1;
vi[4][1]=vi[4][3]=vi[4][5]=1;
vi[2][1]=vi[2][3]=vi[2][7]=1;
vi[6][5]=vi[6][7]=1;
vi[5][3]=vi[5][6]=vi[5][4]=1;
vi[7][3]=vi[7][6]=vi[7][2]=1;
vi[3][4]=vi[3][5]=vi[3][2]=vi[3][7]=1;
}
void check(int k){
if(k==0)return ;
int cnt=7;
for(int i=0;i<=8;i++)p[i]=i;
for(int i=1;i<=7;i++)
if(st[i]){
for(int j=1;j<=7;j++){
if(st[j]&&vi[i][j]){
int a=find(j),b=find(i);
if(a!=b)p[a]=b,cnt--;
}
}
}
if(cnt==7-k+1)ans++;
}
bool check_s(){
int res=0;
for(int i=1;i<=7;i++)if(st[i])res=(res*10+i);
if(h.count(res))return false;
h.insert(res);
return true;
}
void dfs(int k,int s){
// cout<<" "<<k<<" "<<s<<endl;
if(k==8){
if(check_s()){
for(int i=1;i<=7;i++)if(st[i])cout<<i<<" ";
cout<<endl;
check(s);
}
return;
}
for(int i=k;i<=7;i++){
if(!st[i]){
st[i]=1;
dfs(k+1,s+1);
st[i]=0;
dfs(k+1,s);
}
}
}
int main(){
in();
dfs(1,0);
cout<<ans;
}