1. 程式人生 > >C++ P1706 全排列問題

C++ P1706 全排列問題

這個題的有趣之處在於:
如果我們排列確定數量的數字的話,那麼我們只要寫對應數量的for迴圈就好了。
但是這個數量是不確定的。

因為排列數字的數量不確定,所以我們可以用一些特殊的方法來寫不確定數量的for迴圈。
比如:

void xunhuan(int value){
	if(value!=1){
		xunhuan(value-1);
	}
	for(int i=1;i<=n;i++{//此處假設n為迴圈次數
		//do something
	}
}
//呼叫時:xunhuan(3)即可迴圈3次

下面是AC程式碼:

#include<cstdio>
#include<iostream>
using namespace std;
int n,data[101];
bool mark[101];
void print(){
	for(int i=1;i<=n;i++){
		printf("%5d",data[i]);
	}
	cout<<endl;
}
void dfs(int k){
	if(k==n){
		print();
		return;
	}
	for(int i=1;i<=n;i++){
		if(!mark[i]){
			mark[i]=1;
			data[k+1]=i;
			dfs(k+1);
			mark[i]=0;
		}
	}
}
int main(){
	cin>>n;
	dfs(0);
}

可以把一個dfs方法的呼叫認為成一個for迴圈體,也就是說,我們通過在dfs方法內呼叫dfs方法本身,製作了不限量的for迴圈。然後用for迴圈的方式理解即可。

題目(洛谷):https://www.luogu.org/problemnew/show/P1706