// 七段码.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 //思想:二进制求子集,深度优先遍历 #include <iostream> #include<math.h> using namespace std; int b[7]; int map[7][7]; void judge() { int i, j, k; for (i = 0; i < 7; i++)//初始化 for (j = 0; j < 7; j++) map[i][j] = 0; map[0][1] = 1;//建立关系图 map[0][5] = 1; map[1][2] = 1; map[1][0] = 1; map[1][6] = 1; map[2][1] = 1; map[2][6] = 1; map[2][3] = 1; map[3][2] = 1; map[3][4] = 1; map[4][3] = 1; map[4][6] = 1; map[4][5] = 1; map[5][6] = 1; map[5][4] = 1; map[5][0] = 1; map[6][1] = 1; map[6][2] = 1; map[6][4] = 1; map[6][5] = 1; } void gg(int k)//用于判断是否连在一起,从第k个字母开始搜索所有能与与第k个字母连在一起的字母并标记为2 { int i,j; b[k] = 2; for (i = 0; i < 7; i++) { if (map[k][i]==1 && b[i] == 1)//深度优先遍历 gg(i); } } int main() { int i,j,k,l,n,m,g,sum=0; judge(); for (i = 1; i < (1 << 7); i++)//用于生成7个字母的所有子集,注意i为0的时候是空集要去掉 { for (l = 0; l < 7; l++)//初始化 b[l] = 0; k = 0;//用于记录在数组b中放了多少个字母 for (j = 0; j < 7; j++)//生成子串 if (i & (1 << j)) { b[j] = 1;//1表示在j位置上是字母在子串里 k++; } for (g = 0; g < 7; g++)//找到第一个字母所在位置 { if (b[g] == 1) break; } gg(g); m = 0; for (n = 0; n < 7; n++)//当与第g个字母连在一起的字母个数和等于k个时说明k个字母都连在了一起 if (b[n] == 2) m++; if(m==k) sum++; } cout<<sum; }