c++代碼:
#include<bits/stdc++.h>
using namespace std;
#define fo(i,a,b) for(int i=a;i<=b;i++)
bool visit[11];
int a[10];
void dfs(int index)
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);//使c++輸出和c一樣快
if(index==10)
{
cout<<a[1]<<a[2]<<a[3]<<a[4]<<a[5]<<a[6]<<a[7]<<a[8]<<a[9]<<endl;
return;
}
fo(i,1,9)
{
if(!visit[i])
{
visit[i]=true;
a[index]=i;
dfs(index+1);
visit[i]=false;
}
}
}
int main()
{
dfs(1);
return 0;
}
關於這里dfs里面遞歸的個人解讀:(第一組數據123456789到第二組數據123456798的變化過程)
先看第一組數據,一定是遞增的123456789;直接看當index=9后(a1-a9依次賦值為1-9),dfs(index+1/*等於10*/)開始輸出123456789,第9層循環也結束了;於是返回的是上一個循環,也就是第8層循環的位子,順便提帶下,此時visit[9]已經再次賦值為false了(從bool定義后為false后,用了變為true,結束使用后重新為false),但visit[1]-visit[7]還是true狀態(且此時a1-a7還是被賦值為1-7,index值還是為8,而i值由於結束了第9層循環由8(i++)變為9,由於第8層的i=8的遞歸結束了,visit[8]也變為false),所以a8被賦予9(因為此時第8層循環是i=9開始的),visit[9]同時變為true狀態,接下來又進入第9層循環(i從1開始),但因為此時只有visit[8]為false,故dfs(9)會將a9=8;最后就是dfs(10)輸出123456798了;然后visit[7]visit[8]和visit[9]變為false,進入第7層循環,且第7層的i變為8...
/*
visit[i]=true;
...
visit[i]=false;
這里可以理解為,i一旦變換,原來的visit[i]就會變為false;因為在進入visit[i]等於true后,一旦i變化了,就說明這i里的遞歸結束了,則執行visit[i]=false;再執行i++,這樣i才會變化。所以i值變化,則原來的visit[i]一定重新變為false(至少我是這樣想的)
*/