指數型枚舉&&排列型枚舉&&組合型枚舉

one
指數型枚舉

#include <bits/stdc++.h> 
using namespace std;
int n;
int arr[20];
void dfs(int cur,int m)
{
	if(cur == n + 1)
	{
		for(int i = 1;i < m;i++)
			cout<<arr[i]<<" ";
		puts(" ");                     //puts()函數的作用與語句“printf("%s\n",s);的作用相同。注意:puts在輸出字 符串後會自動輸出一個回車符。
		return;
	}
	dfs(cur + 1,m);//不選,仍爲m個數 
	arr[m] = cur;//選出第cur個數 
	dfs(cur + 1,m + 1);//選第cur個數 
}

int main()
{
	cin>>n;
	dfs(1,1);
	return 0;
}
/*
4

4
3
3 4
2
2 4
2 3
2 3 4
1
1 4
1 3
1 3 4
1 2
1 2 4
1 2 3
1 2 3 4
*/

two
排列型枚舉

#include <bits/stdc++.h>
using namespace std;
int n;
int arr[30];
bool vis[30];
void dfs(int cur)
{
    if(cur == n + 1) {
        for(int i = 1; i <= n; ++i) cout << arr[i] << " ";
        puts("");
        return;
    }
    for(int i = 1; i <= n; ++i) {
        if(vis[i]) continue;
        arr[cur] = i;
        vis[i] = true;
        dfs(cur + 1);
        vis[i] = false;
    }
}
int main()
{
    cin >> n;
    dfs(1);
    return 0;
}
*/ 

/*
3
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
*/

three
組合型枚舉

#include <bits/stdc++.h>
using namespace std;
int n, m;
int arr[30];
bool vis[30];

void dfs(int cur)
{
    if(cur == m + 1) {
        for(int i = 1; i <= m; ++i) cout << arr[i] << " ";
        puts("");
        return ;
    }
    for(int i = 1; i <= n; ++i) {
        if(vis[i] || i < arr[cur - 1]) continue;
        arr[cur] = i; //Ñ¡µÚi¸öÊý
        vis[i] = true;
        dfs(cur + 1);
        vis[i] = false;  //»Ö¸´
    }
}

int main()
{
    cin >> n >> m;
    dfs(1);
    return 0;
}*/ 
/*
3 2
1 2
1 3
2 3
*/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章