题目链接

  1. 回溯的时候,需要将状态恢复到原有的样子
  2. 全局数组int path[N]记录状态,用于最后的输出
  3. 开一个bool st[N]数组记录哪些数被用过了

dfs 函数该怎么实现?

void dfs(int u)
{
	if (u == n) // 如果已经走到最后一位数字了
    {
        for(int i = 0; i < n; i ++) printf("%d", path[i]);
        puts("");
        return;
    }
    
    for (int i = 1; i <= n; i ++) // 这里i从1开始是因为题目是因为n在[1, 7]之间
        if (!st[i])
        {
            path[u] = i;
            st[i] = true;
            dfs(u + 1);
            st[i] = false; 	//回溯的时候将状态恢复,i++的一次循环就是一次回溯
        }
}

参考代码

#include <bits/stdc++.h>

using namespace std;

const int N = 1e7 + 10;

int path[N];
int st[N];
int n;

void dfs(int u)
{
    if(u == n)
    {
        for (int i = 0; i < n; i ++) cout << path[i] <<' ';
        puts("");
        return;
    }
    
    for(int i = 1;i <= n; i ++)
        if(!st[i])
        {
            st[i] = true;
            path[u] = i;
            dfs(u + 1);
            st[i] = false;
        }
}

int main()
{
    cin >> n;
    
    dfs(0);
    
    return 0;
}