dfs-全排列(UPC-方案数)

dfs-全排列(UPC-方案数)

全排列的解释
实现思路
举个栗子
实战题目(UPC-方案数)

?!什么是全排列?!
全排列就是把他所有的子集的可能存在位置都全部罗列出来。
比如一个集合是{1,2,3} 这样的话他的全排列将会有如下的情况:
{1,2,3},{1,3,2},{2,1,3},{2,3,1},{3,1,2},{3,2,1}

通 过 C 3 1 ∗ C 2 1 = 6 可 知 , 一 共 包 含 6 种 情 况 。 如 上 所 示 。 通过C_{3}^{1}*C_{2}^{1}=6可知,一共包含6种情况。如上所示。 C31C21=66知道了全排列的含义,那么我们来解决一下如果用高级语言来实现。

实现思路索引目录

dfs-全排列(UPC-方案数)_第1张图片
dfs-全排列(UPC-方案数)_第2张图片

思路就是保留一位,剩下的所有全排列,然后这一位是变化的,每一次保留也是不同的。

举个栗子索引目录

dfs-全排列(UPC-方案数)_第3张图片

用代码实现全排列
输入一个字符串,然后将其所有内容全排列。

#include
#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;
}

dfs-全排列(UPC-方案数)_第4张图片

下面来一道实战题目索引目录

题目描述

计时器游戏结束后,晨晨的同学明明取了其中的K个计时器设计出拼数字游戏:明明和晨晨各自把K个计时器排成一行,看谁拼出的数最大。例如:有K=3个计时器,上面数字分别是31,3,331,两人拼的方案分别是:dfs-全排列(UPC-方案数)_第5张图片
明明拼的数字是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
#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

你可能感兴趣的:(中国石油大学OJ,算法,ACM)