1到9的全排列(用深搜 語言c++)


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(至少我是這樣想的)

*/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM