深搜--1-n的全排列

之前被教过一个next_permutation库函数,是用来实现数的全排列的,具体实现见代码

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    int a[1000];
    int n;
    while(scanf("%d",&n)!=EOF){
        for(int i=0;i<n;i++)
            a[i]=i+1;
        do{
            for(int i=0;i<n;i++)
                cout<<a[i]<<" ";
            cout<<endl;
        }while(next_permutation(a,a[n-1]));
    }
    return 0;
}

  然后自己用深搜写了一遍,之前没搞懂递归结束的条件,和什么时候该输出一个排列,后来相通只要循环到数组的最后一个就输出一个全排列,递归结束。具体见代码

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
int a[10000],vis[10000];
int k,n;
void dfs(){
    if(k==n){
        for(int j=0;j<n-1;j++)
            cout<<a[j]<<" ";
        cout<<a[n-1]<<endl;
        return;
    }//递归的结束以及输出一个排列
    for(int i=1;i<=n;i++){
        if(!vis[i]){
            vis[i]=1;
            a[k++]=i;
            dfs();
            k--;
            vis[i]=0;
        }
    }
}
int main(){
    while(scanf("%d",&n)!=EOF){
        memset(vis,0,sizeof(vis));
        k=0;
        dfs();
    }
    return 0;
}

  

时间: 2024-10-02 11:33:15

深搜--1-n的全排列的相关文章

深搜最基础题---全排列

这个是理解标记和取消标记,用一个vis数组来标记 1 #include <stdio.h> 2 3 int a[100]; 4 int vis[100]; 5 int num;//统计总数 6 void dfs(int n, int cur) 7 { 8 if(n == cur) 9 { 10 for(int i = 0; i < n; i++) 11 printf("%d ", a[i]); 12 printf("\n"); 13 num++;

深搜和广搜

先说说这个神秘的深搜: 前几天我心中的大牛给我讲了深搜感觉还是挺简单的,可大牛告诉我深搜深搜深的让你不知道怎么搜 我们也是从一道题来看:n的全排列 比如说3的全排列 123 213 321 这就是全排列   在没学过深搜的时候我们会用for循环来做这道题 但是如果n很大的时候就不行了 所以我们就一定要深搜了 其实在我看来深搜和递归是亲兄弟 深搜就是递归的加强版 我先写一个简单的dfs(深搜)函数的代码 #include<stdio.h> int dfs(int x) { if(x > n

(暴力+深搜)POJ - 2718 Smallest Difference

原题链接: http://poj.org/problem?id=2718 题意: 给你几个数字,可以分成两个子集,然后分别按一定顺序排列组成一个数,求出这两只值差的绝对值的最小值. 分析: 反正也是刷着玩,果断先交一波全排列枚举的代码,果断TLE,然后开始想正解. 稍微想想,既然要差最小,肯定是两个数各一半.所以只要深搜出所有n/2(n为给定数字的个数)的组合,另外个n-n/2个数就有了. 但是枚举出来后的操作又想了很久,想过很多算法,都不怎么满意,最终用二分解决. 先把n/2和n-n/2全排列

7.5 深搜-最佳调度问题(枚举排列+回溯+剪枝)

这几天偷了几天懒,今天为大家讲解一篇深搜好题,典型的全排列问题需运用剪枝+回溯来优化运行时间,与上一道都是比较典型的深搜优化问题. 题目描述 假设有n个任务由k个可并行工作的机器完成,完成任务i需要的时间为ti,对任意给定的整数n和k,以及完成任务i需要的时间ti,设计一个算法,求完成这n个任务的最佳调度,使得完成全部任务的时间最早. 输入 第一行有2个正整数n和k,第二行有n个正整数,表示ti n<7000,c<maxlongin 输出 一个整数,输出最早时间 样例输入 7 3 2 14 4

hdu1455 Sticks 深搜 强剪枝

Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6035    Accepted Submission(s): 1704 Problem Description George took sticks of the same length and cut them randomly until all parts becam

深搜笔记

看搜索已经很久了,对于搜索的思想从原来的死记硬背到现在终于懂了一点其实也蛮不错吧,我自己先总结出来了几条关于在图里面深搜的几条方法,仅供参考: 首先:我们得知道深搜是什么,其次于广搜的区别是什么.然后又哪些模板 举一个深搜例子:red and black:这是初学者最常见到的题.对于这题我们所要考虑的就是一个'.'的个数,这个题先要找到@的位置,这个好办,直接: for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { if(map[i][j]=='@') }

HDU1342 Lotto 【深搜】

应用 渗透问题 游戏中会用到. 动态连接 最近共同祖先 等价有限状态机 物理学Hoshen-Kopelman算法:就是对网格中的像素进行分块 Hinley-Milner多态类型推断 Kruskai最小生成树 Fortran等价语句编译 形态学开闭属性 Matlab中关于图像处理的bwlabel函数 渗透问题 一个N×N的矩阵,判断顶部和底部是否连通就是渗透问题. 下图中左侧的矩阵能渗透,右侧矩阵不能渗透. 渗透问题在电学.流体力学.社会交际中都有应用. 在游戏中可能需要生成一张地图,但是作为地图

HDU5723 Abandoned country 最小生成树+深搜回溯法

Description An abandoned country has n(n≤100000) villages which are numbered from 1 to n. Since abandoned for a long time, the roads need to be re-built. There are m(m≤1000000) roads to be re-built, the length of each road is wi(wi≤1000000). Guarante

CodeM美团点评编程大赛初赛B轮 黑白树【DFS深搜+暴力】

[编程题] 黑白树 时间限制:1秒 空间限制:32768K 一棵n个点的有根树,1号点为根,相邻的两个节点之间的距离为1.树上每个节点i对应一个值k[i].每个点都有一个颜色,初始的时候所有点都是白色的. 你需要通过一系列操作使得最终每个点变成黑色.每次操作需要选择一个节点i,i必须是白色的,然后i到根的链上(包括节点i与根)所有与节点i距离小于k[i]的点都会变黑,已经是黑的点保持为黑.问最少使用几次操作能把整棵树变黑. 输入描述: 第一行一个整数n (1 ≤ n ≤ 10^5) 接下来n-1