题目
题目链接
给出几个互相交错的框,输出交叠的顺序,根据题意,每个由字母组成的框(frame)的每一个边都会至少有一个字母在交叠后的图中,所以扫描一遍输入图就可以得到边界。扫描其中一个框Y,如果边上有其他字母X,则构造一条边 X -> Y,表明框X在框Y之上。
算法
使用回溯法(深度优先搜索),保存每一个可能的排序。即如果当前存在两个入度为0的节点A、B,先保存A或先保存B。
代码
#include<iostream>
#include<vector>
#include<string>
#include <unordered_set>
#include <list>
#include <algorithm>
using namespace std;
struct Frame{
int x1, x2, y1, y2;
char letter;
Frame(){
this->letter = '.';
x1 = y1 = 0x7fffffff;
x2 = y2 = 0;
}
};
void dfs(vector<string>& ans, list<char>& seq, vector<int>& count, unordered_set<char>& letters, const vector<vector<bool>>& graph) {
if (seq.size() == letters.size()) {
ans.emplace_back(seq.begin(), seq.end());
} else {
for (auto& c : letters) {
if (count[c-'A'] == 0 && seq.end() == find(seq.