题目
- 小蓝要用七段码数码管来表示一种特殊的文字。
- 数码管之间要相互连接
求,最多可以表示多少个不同的字符?
思路
- 将各个数码管映射为数字0-6
- 构建矩阵,m[ i ][ j ] = 1表示,i 和 j 连通;否则为0,表示不连通。
- 使用回溯算法(进行组合)
- 判断是否各个数码管是否连通(图的连通问题,使用了队列进行广度优先搜索)
源代码
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
bool isValid(int m[7][7], vector<int> &v) {
if (v.size() == 0)
return false;
if (v.size() == 1)
return true;
vector<int> visit(v.size(), 0);
queue<int> q;
q.push(v[0]);
visit[0] = 1;
int count = 0;
while (!q.empty()) {
int i = q.front();
q.pop();
for (int j = 0; j < v.size(); ++j) {
if (m[i][v[j]] && !visit[j]) {
q.push(v[j]);
visit[j] = 1;
}
}
}
for (int i = 0; i < v.size(); ++i) {
if (!visit[i])
return false;
}
return true;
}
void f(int m[7][7], int &result, vector<int> &v, int begin) {
if (isValid(m, v)) {
++result;
}
for (int i = begin; i < 7; ++i) {
v.push_back(i);
f(m, result, v, i+1);
v.erase(v.end()-1);
}
return;
}
int main() {
int result = 0;
int m[7][7] = {
{0, 1, 0, 0, 0, 1, 0},
{1, 0, 1, 0, 0, 0, 1},
{0, 1, 0, 1, 0, 0, 1},
{0, 0, 1, 0, 1, 0, 0},
{0, 0, 0, 1, 0, 1, 1},
{1, 0, 0, 0, 1, 0, 1},
{0, 1, 1, 0, 1, 1, 0}
};
vector<int> v;
f(m, result, v, 0);
cout << result;
return 0;
}
答案
- 80