dfs-全排列(UPC-方案数)
全排列的解释
实现思路
举个栗子
实战题目(UPC-方案数)
?!什么是全排列?!
全排列就是把他所有的子集的可能存在位置都全部罗列出来。
比如一个集合是{1,2,3} 这样的话他的全排列将会有如下的情况:
{1,2,3},{1,3,2},{2,1,3},{2,3,1},{3,1,2},{3,2,1}
知道了全排列的含义,那么我们来解决一下如果用高级语言来实现。
实现思路索引目录
思路就是保留一位,剩下的所有全排列,然后这一位是变化的,每一次保留也是不同的。
举个栗子索引目录
用代码实现全排列
输入一个字符串,然后将其所有内容全排列。
#include<bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
typedef long long ll;
int num;
set<string>dict;
char save[50];
void dfs(int t) {
if(t==num) {
cout<<save<<endl;
return ;
}
for(int i=t; i<num; i++) {
char temp;
temp=save[t];
save[t]=save[i];
save[i]=temp;
dfs(t+1);
temp=save[t];
save[t]=save[i];
save[i]=temp;
}
}
int main() {
gets(save);
num=strlen(save);
dfs(0);
return 0;
}
下面来一道实战题目索引目录
题目描述
计时器游戏结束后,晨晨的同学明明取了其中的K个计时器设计出拼数字游戏:明明和晨晨各自把K个计时器排成一行,看谁拼出的数最大。例如:有K=3个计时器,上面数字分别是31,3,331,两人拼的方案分别是:
明明拼的数字是333131,晨晨拼的数字是331313,显然明明赢。
明明掌握了拼出最大值的核心算法,晨晨下决心也要研究。不过她首先要编程统计这K个计时器能拼出多少种不同的方案?
注意,现在的计时器更先进,可以显示4位数字。
输入
第一行:1个整数K。(1 ≤ K ≤ 4)
第二行K个整数:表示K个计时器上的数。(所有数均为大于0小于10000的整数)
输出
一个整数,表示拼成不同数的方案数。
Sample Input
3
31 3 331
Sample Output
5
Hint
(3 31 331)和(331 3 31)拼出的方案是相同的数331331,只算一种。
思路就是全排列,然后再用set集合函数,把多少类给统计出来。
AC时间到
#include<bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
typedef long long ll;
int num;
set<string>dict;
char save[50][50];
void dfs(int t,char (*save)[50]) {
if(t==num) {
char store[2500];
memset(store,0,sizeof(store));
for(int i=0; i<num; i++)
strcat(store,save[i]);
dict.insert(store);
return ;
}
for(int i=t; i<num; i++) {
char temp[50];
strcpy(temp,save[t]);
strcpy(save[t],save[i]);
strcpy(save[i],temp);
dfs(t+1,save);
strcpy(temp,save[t]);
strcpy(save[t],save[i]);
strcpy(save[i],temp);
}
}
int main() {
cin>>num;
for(int i=0; i<num; i++)
cin>>save[i];
dfs(0,save);
cout<<dict.size()<<endl;
return 0;
}
到此dfs全排列到一段落。若有错误还望指正,若有不足尽情评论。
最近学会了彩色字体,用起来有点上瘾啊。哈哈哈嗝~~
By-轮月
鸣谢Mr.Zhang