全排列——DFS实现
原创
之间就写过一篇全排列的博客:https://www.cnblogs.com/chiweiming/p/8727164.html
详细介绍请回看,用的方法(暂且就叫)是“交换法”,其实思路就是DFS(深度优先搜索),此篇博客对上次全排列思想进行一次升华。
例子:
有3个盒子 1、2、3,3张扑克牌 1、2、3,进行扑克牌全排列可以这样实现:
不管面对哪个盒子,都尝试按“1--n”的顺序将扑克牌放入,如果第m张扑克牌已经用过,判断第m+1张是否可用。
当放满n个盒子时,回头,把盒子里面的牌捡回来,再继续按顺序放牌进盒子。
过程:
第1个盒子:放入1号牌
第2个盒子:本来应该放入1号牌,但是由于1号牌已用,只能按顺序放入2号牌
第3个盒子:本来应该放入1号牌,但是1号牌已用,而且判断2号牌也已用,只能放入3号牌
盒子放满,输出
回头,捡回第3个盒子的牌;
第3个盒子:由于手里只有3号牌,放不了了,只能再回头
第2个盒子:捡回2号牌,此时手里剩2、3号牌,对于第2个盒子,按顺序放牌、现在可以将3号牌放入。
第3个盒子:重新按“1--n”的顺序放牌,所以放入2号牌
回头......
(其实本人第一篇的全排列博客也是用了DFS,每个位置都按顺序放入数字)
(DFS的思想:这一步的选择和下一步的选择相同,进入下一步只需像上层操作即可)
import java.util.Scanner;
public class FullSort {
static int n;
static int total=0;
static int box[]; //装入牌
static int pai[]; //pai[m]=1代表第m张牌已用,=0代表未用
public static void full_Sort(int step) { //step代表第step个盒子
if(step==n+1) {
for(int i=1;i<=n;i++) {
System.out.print(box[i]+" ");
}
System.out.println();
total++;
return;
}
for(int i=1;i<=n;i++) { //每个盒子都尝试按“顺序”放入1~n张牌
if(pai[i]==0) { //第i张牌没用
box[step]=i;
pai[i]=1;
full_Sort(step+1);
pai[i]=0; //回溯
}
}
}
public static void main(String[] args){
Scanner reader=new Scanner(System.in);
n=reader.nextInt(); //1~n张扑克牌
box=new int[n+1];
pai=new int[n+1];
for(int i=1;i<=n;i++) { //每张牌都未用
pai[i]=0;
}
full_Sort(1);
System.out.println("一共有"+total+"种排列");
}
}
全排列
13:37:24
2018-07-08
全排列——DFS实现的更多相关文章
- for循环枚举法,全排列+dfs,补充浮点数注意事项
其实这个题目我一直没想好应该叫什么,就是在做蓝桥杯的时候会遇到很多的题,给你一等式,abcdef...分别是1-9(||12||15)不重复问你有几种方案? 我之前一直都是用的for循环在做,听说这叫 ...
- 组合数学(全排列)+DFS CSU 1563 Lexicography
题目传送门 /* 题意:求第K个全排列 组合数学:首先,使用next_permutation 函数会超时,思路应该转变, 摘抄网上的解法如下: 假设第一位是a,不论a是什么数,axxxxxxxx一共有 ...
- 数的全排列 dfs深度优先搜索
数的全排列. 输入格式: 一个n(n<10),表示长度 输出格式: 按字典序输出长度为n的所有排列,每个排列后需要换行,每个排列数字以空格分开. 输入样例: 在这里给出一组输入.例如: 3 输出 ...
- uva 10344 23 out of 5 凑运算结果 全排列+dfs
五个数三个运算符号,排列之后凑成结果为23,不考虑优先级. 很水,数据量也不大,先生成五个数的全排列,用dfs找出结果能否为23即可. 代码: #include <cstdio> #inc ...
- zzulioj--1730--通信基站(全排列+dfs)(好题)
1730: 通信基站 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 28 Solved: 11 SubmitStatusWeb Board Desc ...
- 全排列dfs算法
如下 #include <iostream> using namespace std; #define MAX 10 #define _CRT_SECURE_NO_WARNINGS int ...
- 蓝桥杯 剪邮票 全排列+DFS
剪邮票 如[图1.jpg], 有12张连在一起的12生肖的邮票. 现在你要从中剪下5张来,要求必须是连着的. (仅仅连接一个角不算相连) 比如,[图2.jpg],[图3.jpg]中,粉红色所示部分就是 ...
- wikioi 1294 全排列 dfs
1294 全排列 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 给出一个n, 请输出n的所有全排列 输入描述 Inpu ...
- 输出1-n的全排列dfs
https://ac.nowcoder.com/acm/contest/998/C #include<stdio.h> #include<iostream> #include ...
随机推荐
- nginx 限制
在nginx.conf里的http{}里添加: http{ limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $s ...
- C 游戏所要看的书
C 游戏所要看的书 1.C++primer中文版第4版 经典啊2.C++标准程序库自修教程与参考手册 3.Windows程序设计第5版 4.MFC windows程序设计第2版中文版 5.VC ...
- 找回mysql root用户的密码
1.停掉mysql服务ps -ef | grep mysqldkill -9 mysql进程的pid2.vi /etc/my.cnf找到[mysqld]在下面添加一行skip-grant-tables ...
- codeforce 985B Switches and Lamps(暴力+思维)
Switches and Lamps time limit per test 3 seconds memory limit per test 256 megabytes input standard ...
- Unity Shader入门精要读书笔记(二)UnityShader概述
第三章<UnityShader概述>的读书笔记: 1.Unity Shader模板提供了几种选择: 标准光照模型(新添加的基于物理的渲染方法) 不含光照的基本的顶点.片元着色器 屏幕后处理 ...
- Docker - 使用 swarm 部署 services
前言 经过之前一段时间学习与思考,我们已经大概明确了一些感念: Docker image/container, service and node 简单来说,swarm允许我们以节点(node)的方式 ...
- 聚类 高维聚类 聚类评估标准 EM模型聚类
高维数据的聚类分析 高维聚类研究方向 高维数据聚类的难点在于: 1.适用于普通集合的聚类算法,在高维数据集合中效率极低 2.由于高维空间的稀疏性以及最近邻特性,高维的空间中基本不存在数据簇. 在高维聚 ...
- python使用multiprocessing进行多进程编程(1)
multiprocessing模块实现了对多进程编程的封装,让我们可以非常方便的使用多进程进行编程.它的使用方法非常类似threading模块. 1.创建一个进程 import multiproces ...
- Color the ball (线段树的区间更新问题)
N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色.但 ...
- flask+jsonp跨域前后台交互(接口初体验)
1 # -*- coding: utf-8 -*- 2 from flask import Flask, jsonify 3 import psutil, time,json 4 5 app = Fl ...