#include <iostream>
#include <vector>
using namespace std;
void back_track(vector<int>& arr,vector<vector<int>>& result,vector<bool>& statu,vector<int>& path)
{
if(path.size()==arr.size())
{
result.emplace_back(path);
}
for(int i=0;i<arr.size();++i)
{
if(statu[i]==false)
{
statu[i]=true;
path.push_back(arr[i]);
back_track(arr,result,statu,path);
path.pop_back();
statu[i]=false;
}
}
}
int main() {
int n;
cin>>n;
vector<bool> statu(n,false);
vector<int> path;
vector<int> arr(n,0);
vector<vector<int>> result;
for(int i=0;i<n;++i)
{
arr[i]=i+1;
}
back_track(arr,result,statu,path);
for(int i=0;i<result.size();++i)
{
for(int j=0;j<result[0].size();++j)
{
cout<<result[i][j]<<' ';
}
cout<<'\n';
}
return 0;
} 经典回溯
#include <ctime>
#include <iostream>
#include <deque>
#include <vector>
using namespace std;
class test
{
public:
static void foo(deque<int>& out_temp, vector<bool>& state,size_t const& num)
{
if(state.back() == false && out_temp.size() == num)
{
for (auto const& v : out_temp) {
cout<< v<<" ";
}
cout <<endl;
return;
}
for (int i = 0; i<num; ++i)
{
if (state.at(i))
{
state.at(i) = false;
out_temp.emplace_back(i+1);
foo( out_temp, state, num);
out_temp.pop_back();
state.at(i) = true;
}
}
}
};
int main() {
int n;
while (cin >> n) { // 注意 while 处理多个 case
deque<int> out_temp;
vector<bool> state(n,true);
test::foo( out_temp, state, n);
}
}
// 64 位输出请用 printf("%lld") #include <iostream>
#include <vector>
using namespace std;
void dfs(int n, vector<int>& path, vector<bool>& visited) {
// 如果路径长度等于n,说明找到一个排列
if (path.size() == n) {
for (int i = 0; i < n; i++) {
cout << path[i];
if (i < n - 1) cout << " ";
}
cout << endl;
return;
}
// 尝试每个数字
for (int i = 1; i <= n; i++) {
if (!visited[i]) { // 如果数字i还没被使用
visited[i] = true; // 标记为已访问
path.push_back(i); // 加入当前路径
dfs(n, path, visited); // 递归深入
path.pop_back(); // 回溯,移除最后一个元素
visited[i] = false; // 取消标记
}
}
}
int main() {
int n;
cin >> n;
vector<int> path; // 存储当前路径
vector<bool> visited(n + 1, false); // 标记数字是否使用过
dfs(n, path, visited);
return 0;
}