zl程序教程

您现在的位置是:首页 >  前端

当前栏目

回溯类问题框架

框架 回溯 问题
2023-09-14 09:15:27 时间

请添加图片描述

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);
}