標籤:bsp dfs sync int 資料 遞增 ret using 迴圈
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;
}
順便附帶c代碼(666):
#include<stdio.h>
int a[10];
bool visit[11];
void dfs(int index)
{
if(index==10)
{
printf("%d%d%d%d%d%d%d%d%d\n",a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);
return;
}
for(int i=1;i<=9;i++)
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(至少我是這樣想的)
*/
1到9的全排列(用深搜 語言c++)