题目1120:全排列(回溯法)

题目链接:http://ac.jobdu.com/problem.php?pid=1120

详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus

参考代码:

//
//  1120 全排列.cpp
//  Jobdu
//
//  Created by PengFei_Zheng on 23/04/2017.
//  Copyright © 2017 PengFei_Zheng. All rights reserved.
//

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <cmath>
#define MAX_SIZE 7

using namespace std;

char str[MAX_SIZE];
char ans[MAX_SIZE];
bool used[MAX_SIZE];
int len;

void prem(int x){
    if(x == len){
        ans[x]=‘\0‘;
        printf("%s\n",ans);
        return;
    }
    for(int i = 0 ; i < len ; i++){
        if(!used[i]){
            used[i] = true;
            ans[x] = str[i];
            prem(x+1);
            used[i]=false;
        }
    }
}
int main(){
    while(scanf("%s",str)!=EOF){
        memset(used,false,sizeof(used));
        len = (int)strlen(str);
        prem(0);
        printf("\n");
    }
    return 0;
}
/**************************************************************
    Problem: 1120
    User: zpfbuaa
    Language: C++
    Result: Accepted
    Time:440 ms
    Memory:1520 kb
****************************************************************/
时间: 2024-08-27 07:51:17

题目1120:全排列(回溯法)的相关文章

南邮算法分析与设计实验3 回溯法

回溯法 实验目的: 学习编程实现深度优先搜索状态空间树求解实际问题的方法,着重体会求解第一个可行解和求解所有可行解之间的差别.加深理解回溯法通过搜索状态空间树.同时用约束函数剪去不含答案状态子树的算法思想,会用蒙特卡罗方法估计算法实际生成的状态空间树的结点数. 实验内容: 1.求24点问题 给定四个1-9之间的自然数,其中每个数字只能使用一次,用算术运算符+,-,*,/构造出一个表达式,将这4个正整数连接起来(可以使用括号),使最终的得数为24.要求根据问题的特征设计具体算法并编程实现,输入数据

回溯法 求集合全排列、子集

全排列: 全排列是将一组数按一定顺序进行排列,如果这组数有n个,那么全排列数为n!个. 从集合中依次选出每一个元素,作为排列的第一个元素,然后对剩余的元素进行全排列,如此递归处理,从而得到所有元素的全排列. 以对字符串abc进行全排列为例,我们可以这么做:以abc为例固定a,求后面bc的排列:abc,acb,求好后,a和b交换,得到bac固定b,求后面ac的排列:bac,bca,求好后,c放到第一位置,得到cba固定c,求后面ba的排列:cba,cab. 这个思想和回溯法比较吻合. 代码可如下编

回溯法(backtracking) 题目整理--------part2

N-Queens 模拟退火不会写 0.0 The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other. Given an integer n, return all distinct solutions to the n-queens puzzle. Each solution contains a distinct bo

回溯法--全排列

a=[1,2,3] n=len(a) res=[] def permutation(a,solution): #注意,这里要用global修饰res,才能更新结果 global res if len(a)==0: res.append(solution) return for i in range(len(a)): newsolution=solution+[a[i]] new_a=a[:i]+a[i+1:] permutation(new_a,newsolution) permutation(

回溯法与树的遍历

关于回溯法和DFS做下总结: 在程序设计中有一类题目求一组解或者求全部解或者求最优解等系列问题,不是根据某种特定的规则来计算,而是通过试探和回溯的搜索来查找结果,通常都会设计为递归形式. 这类题本身是一颗状态树,当只有两种情况的时候则为二叉树,这棵树不是之前建立的,而是隐含在遍历过程中的.接下来根据一些题目来提高认识. 一.二叉状态树 题目: 说白了就是一个全遍历的过程,找出每一种可能的组合.对于123则有题目中的8种情况. 思路: 这样的全排列问题可以从元素本身入手,每一个元素只有两种状态,被

算法复习笔记(回溯法,分支限界法)

回溯法 分支限界法 回溯法 回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法. 基本思想: 在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树.当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索下去,如果该结点不包含问题的解,则逐层向其祖先结点回溯.(其实回溯法就是对隐式图的深度优先搜索

回溯法总结

转  http://www.zhimengzhe.com/bianchengjiaocheng/Javabiancheng/257227.html 1.回溯法 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就"回溯"返回,尝试别的路径.回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为

17图的搜索算法之回溯法

回 溯 法 回溯算法实际是一个类似枚举的搜索尝试方法,它的主题思想是在搜索尝试中找问题的解,当不满足求解条件就"回溯"返回,尝试别的路径.回溯算法是尝试搜索算法中最为基本的一种算法,其采用了一种"走不通就掉头"的思想,作为其控制结构. [例1]八皇后问题模型建立 要在8*8的国际象棋棋盘中放八个皇后,使任意两个皇后都不能互相吃掉.规则:皇后能吃掉同一行.同一列.同一对角线的任意棋子.如图5-12为一种方案,求所有的解. 模型建立 不妨设八个皇后为xi,她们分别在第i

回溯法专题

回溯法专题 回溯法(Backtracking)指的是在每个状态的固化,比如f(1)是一个状态,f(2)是另一个状态.从f(1)到f(2),状态改变,各种依赖状态的数据也改变了,那么从f(2)到f(1)的时候,又回到了f(1)的状态了.回溯常常配合深度优先执行,在往深度时候,数据产生变化,然后在递归回来的时候,又回到了之前的状态. 46. Permutations 拿这道全排列来讲,它按照正常顺序列出了全部的排列结果,也可以叫做字典序,主要是输入是按从小到大的话,输出就是字典序. 按照递归的方式来