回溯类问题框架
Posted 看,未来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了回溯类问题框架相关的知识,希望对你有一定的参考价值。
N叉树的前序遍历
void preorder(Node* node) {
cout << "value:" << node->val << endl;
for (Node* n : node->children) {
preorder(n);
}
return;
}
其实回溯,可不就是N叉树的前序遍历带上功能嘛。
回溯框架
vector<T> res;
void back_track(路径,选择列表){
if(满足结束条件){
res.push_back(路径);
}
for 选择 in 选择列表{
做选择
back_track(路径+1,选择列表);
撤销选择
}
}
示例
【C++】算法集锦(3):回溯,从入门到入土,七道试题精选、精讲、精练
4*4数独
#include<iostream>
#include<vector>
using namespace std;
bool check(vector<vector<int>>& vvec, int a, int b, int num) {
for (int i : vvec[a]) {
if (i == num) {
return false;
}
}
if (vvec[0][b] == num || vvec[1][b] == num || vvec[2][b] == num || vvec[3][b] == num) {
return false;
}
return true;
}
bool numbers_game(vector<vector<int>>& vvec, vector<int>& vec, int a, int b) {
if (b == 4) {
a++;
b = 0;
}
if (a == 4) {
cout << "OK" << endl;
return true;
}
for (int i : vec) {
if (check(vvec, a, b, i)) {
vvec[a][b] = i;
return numbers_game(vvec, vec, a, b+1);
}
vvec[a][b] = 0;
}
return false;
}
int main() {
vector<vector<int>> vvec = { {0,0,0,0},{0,0,0,0},{0,0,0,0} ,{0,0,0,0} };
vector<int> vec = { 1,2,3,4 };
cout << numbers_game(vvec, vec, 0, 0);
}
以上是关于回溯类问题框架的主要内容,如果未能解决你的问题,请参考以下文章