需要注意,要用printf("\n")不然会超时
以及vis[i]=0的回溯:个人感觉吧像是 把已经获得过全排列的数的标记重置了一遍。
比如n=3,第一个全排列是1 2 3 ,然后运行到了dfs(4),此时就返回到dfs(step+1);随后vis【3】=1,再返回到第二层是i=2,随后vis【2】=1。然后第二层的i++,i=3,然后继续dfs(step+1)到第三层的时候就只有2了。 所以第二个全排列是 1 3 2
如图
#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;
int num[10], vis[10];
int n;
void dfs(int step){
if (step == n + 1) {
for (int i = 1; i <= n; i++) {
cout << num[i];
}printf("\n");
return;
}
for (int i = 1; i <= n; i++) {
if (vis[i] == 0) {
num[step] = i;
vis[i] = 1;
bfs(step + 1);
vis[i] = 0;
}
}
}
int main() {
while (cin >> n) {
memset(vis, 0, sizeof(vis));
dfs(1);
}
}