dfs全排列和全组合问题

P1706 全排列问题 - 洛谷

cpp 复制代码
//1.手写dfs + hx哈希标记 
//2.stl函数 next_permutation
//3.我开始错误的swap思路 

//#include <iostream>
//#include <iomanip>
//#include <algorithm>
//using namespace std;
//#define int long long
//#define endl '\n'
//
//int n = 0;
//int arr[20];
//int hx[20]; 
//
//void dfs(int cnt){
//	if(cnt == n + 1){ // cnt == n
//		for(int i = 1 ; i <= n ; ++i){
//			cout << setw(5) << arr[i];
//		}
//		cout << endl;
//		return;
//	}
//	
//	for(int i = 1 ; i <= n ; ++i){
//		if(!hx[i]){
//			arr[cnt] = i; // arr[cnt + 1] = i;
//			hx[i] = 1;
//			dfs(cnt + 1);
//			hx[i] = 0;
//		}
//	}
//}
//
//signed main(){
//	ios::sync_with_stdio(0);
//	cin.tie(0),cout.tie(0);
//	
//	cin >> n;
//	
//	dfs(1); // dfs(0);
//	
//	return 0;
//}
//
//
#include <iostream>
#include <iomanip>
#include <algorithm>
using namespace std;
#define int long long
#define endl '\n'

int n = 0;
int arr[20];

signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	
	cin >> n;
	
    for(int i = 1 ; i <= n ; ++i){
        arr[i] = i;
    }

    do {
        for(int i = 1 ; i <= n ; ++i){
			cout << setw(5) << arr[i];
		}
		cout << endl;
    } while (next_permutation(arr + 1, arr + 1 + n)); // 它会自动把数组变成下一个更大的排列
    
	return 0;
}



//#include <iostream>
//#include <iomanip>
//#include <algorithm>
//using namespace std;
//#define int long long
//#define endl '\n'
//
//int n = 0;
//int arr[20];
//
//void dfs(int left,int right){
//	if(left == 0){
//		return;
//	}
//	
//	swap(arr[left],arr[right]);
//	for(int i = 1 ; i <= n ; ++i){
//		cout << setw(5) << arr[i];
//	}
//	cout << endl;
//	swap(arr[left],arr[right]);
//	
//	if(right == n){
//		dfs(left - 1,left);
//		return; 
//	}
//	else{
////		right++;
//		dfs(left + 1,right + 1);
//		return; 
//	}
//}
//
//signed main(){
//	ios::sync_with_stdio(0);
//	cin.tie(0),cout.tie(0);
//	
//	cin >> n;
//	
//	for(int i = 1 ; i <= n ; ++i){
//		arr[i] = i;
//		cout << setw(5) << arr[i]; 
//	}
//	cout << endl;
//	
//	dfs(n-1,n);
//	
//	return 0;
//}

P1157 组合的输出 - 洛谷

cpp 复制代码
#include <iostream>
#include <iomanip> 
using namespace std;
#define int long long
#define endl '\n'

int n = 0,r = 0;
//int id = 1;
int jl[25]; 

void dfs(int start,int cnt){
	if(cnt > r){
		for(int i = 1 ; i <= r ; ++i){
			cout << setw(3) << jl[i]; 
		}
		cout << endl;
//		id = cnt - 1; 
//		cnt = 0;
		return;
	}
	
	for(int i = start ; i <= n ; ++i){
//		if(cnt <= r){
//			cout << setw(3) << i;
//		cout << "jl[" << cnt << "] = " << i << endl;
		jl[cnt] = i;
		dfs(i + 1,cnt + 1);
//		}
	}
}
 
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	
	cin >> n >> r;
	
	dfs(1,1);
	
	return 0;
}

刚刚那题全组合问题的重新理了一下思路:"

1.首先看题目数据,数据非常小说明出题人可能想让我们用枚举,也就是dfs。

2.好看回题目,确实我们人枚举也可以枚举出来,比如从三个数里面选两个数,我们很容易想到是12,13,和23。接着我们要把我们怎么想到这三种情况的告诉计算机。

3.首先从三个数里面选就得告诉计算机里现在有三个数为1,2,3,所以我们要用一个for循环,从1到3。

4.接着我们需要判断,是否已经够了两个数,所以我们需要给DFS一个变量为cnt来记录我们现在已经有了几个数。

(1)判断如果如果够了,你需要打印之前记录下来的数,并且返回,

所以我们需要一个数组记录我们之前记录下的数。

(2)如果没有够的话,比如我们先选1,判断1还没到两个数就应该进入下一层dfs(因为判断是在DFS的前面的用于返回,所以你应该进入下一层DFS,而不是直接记录for循环里面的i加加后的2),又因为要大于一,所以你应该把二传下去,还有cnt传下去,

所以现在需要一个变量start,作为DFS的参数。所以我们现在DFS为(int cnt,int start)进入(2,2)的时候,因为我们一开始说了for循环从一到n开始,现在发现我们有漏洞,我们要从start开始。

以上是我的完整思路。"

相关推荐
千寻girling43 分钟前
Python 是用来做 AI 人工智能 的 , 不适合开发 Web 网站 | 《Web框架》
人工智能·后端·算法
颜酱4 小时前
一步步实现字符串计算器:从「转整数」到「带括号与优化」
javascript·后端·算法
CoovallyAIHub1 天前
语音AI Agent编排框架!Pipecat斩获10K+ Star,60+集成开箱即用,亚秒级对话延迟接近真人反应速度!
深度学习·算法·计算机视觉
木心月转码ing1 天前
Hot100-Day14-T33搜索旋转排序数组
算法
会员源码网1 天前
内存泄漏(如未关闭流、缓存无限增长)
算法
颜酱1 天前
从0到1实现LFU缓存:思路拆解+代码落地
javascript·后端·算法
颜酱1 天前
从0到1实现LRU缓存:思路拆解+代码落地
javascript·后端·算法
CoovallyAIHub2 天前
Moonshine:比 Whisper 快 100 倍的端侧语音识别神器,Star 6.6K!
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
速度暴涨10倍、成本暴降6倍!Mercury 2用扩散取代自回归,重新定义LLM推理速度
深度学习·算法·计算机视觉