다음과 같은 변형을 생성하는 함수가 있습니다. 111, 112, ..., 133, 211, 212, ..., 233, 311, ..., 333. 생성 된 시퀀스의 길이는 항상 사전의 길이와 일치합니다. 4 개의 기호를 사용하면 1111에서 4444가됩니다.C++ : 반복되는 변형에 대한 재귀 함수, 다른 문자의 양으로 정렬
그래프 채색을위한 무차별 대입 알고리즘에서 수행됩니다. Google은 가능한 한 다른 색상을 사용하지 않는 올바른 순서를 찾으려고합니다. 즉, 12343과 12321이 모두 해결책 인 경우 후자를 선호합니다.
지금 당장 나는 모든 시퀀스가 올바른지 확인한 다음 최상의 결과를 저장합니다. 정말 좋은 코드는 아닙니다.
그래서 교수님은 특정 순서로 변형을 생성하는 함수를 작성하라고했습니다. 이 순서는 다음과 같이 서로 다른 숫자로 정렬해야합니다 : 111, 222, 333; 112, 113, 121, ..., 323; 123, 213.이 경우, 121이 맞다는 것을 알게되면, 우리는 이미 그것이 최선의 해결책이라는 것을 알고 있기 때문에 멈추게됩니다.
아이디어는 가능한 한 많은 시퀀스 검사를 건너 뛰고 코드가 더 빨리 실행되도록하는 것입니다. 제발 도와주세요 :)
를 지금 나는이 코드를 사용합니다
init 함수를
std::vector<int> res; //contains the "alphabet"
res.reserve(V);
for (int i = V - 1; i >= 0; i--) {
res.push_back(i);
}
std::vector<int> index(res.size());
std::vector<int> bestresult(V); //here goes the best answer if it's found
for (int i = V - 1; i >= 0; i--) {
bestresult.push_back(i);
}
int bestcolors = V;
permutate(res, index, 0, bestresult, bestcolors);
result = bestresult;
순열 :
void Graph::permutate(const std::vector<int>& s, std::vector<int>& index, std::size_t depth, std::vector<int>& bestres, int &lowestAmountOfColors)
{
if (depth == s.size()) {
//doing all needed checks and saving bestresult here;
return;
}
for (std::size_t i = 0; i < s.size(); ++i) {
index[depth] = i;
permutate(s, index, depth + 1, bestres, lowestAmountOfColors);
}
}
가 어떻게 이러한 기능을 변경할 수 있습니까?
질문이 있습니다. 색상 사이에 차이가 있습니까? 그렇다면 '111'을 확인한 후에 '222'를 고려해야합니까? 그래프 채색의 경우, 색상을 바꾸면 답이 동일 할 것으로 예상됩니다. 따라서, 케이스 n에 대해, 고려 될 순열은 1, 2, ... n 중 적어도 하나를 포함해야한다. –
당신 말이 맞아서는 안됩니다. 나는 그것을 말하고 싶었지만 나는 영어에 유창하지 않다. – JonathanX64
(적어도 하나는 각각) –