【回溯】数字排列问题

问题 S: 【回溯】数字排列问题

时间限制: 1 Sec  内存限制: 128 MB
提交: 11  解决: 9
[提交][状态][讨论版]

题目描述

列出所有从数字1到数字n的连续自然数的排列,要求所产生的任一数字序列中不允许出现重复的数字。

输入

n(1≤n≤9)

输出

由1~n组成的所有不重复的数字序列,每行一个序列。

样例输入

3

样例输出

    1    2    3
    1    3    2
    2    1    3
    2    3    1
    3    1    2
    3    2    1

解题思路:  跟n皇后解法很类似,写递归函数,找好退出条件。

代码:
#include <iostream>
#include <cstdio>

using namespace std;

int n;
int a[10]={0};
int yn[10]={0};

void backtrack(int location){
    if(location==n+1){
        for(int i=1;i<=n;i++){
            printf("    %d",a[i]);
        }
        printf("\n");
    }else{
        for(int i=1;i<=n;i++){
            if(!yn[i]){
                a[location]=i;
                yn[i]=1;
                backtrack(location+1);
                yn[i]=0;
            }
        }
    }
}

int main()
{
    scanf("%d",&n);
    backtrack(1);
    return 0;
}
时间: 2024-12-28 15:41:57

【回溯】数字排列问题的相关文章

回溯法第1题—数字排列问题

[问题描述] 列出所有从数字1到数字n的连续自然数的排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入:n(1<=n<=9) 输出:由1~n组成的所有不重复的数字序列,每行一个序列. [样例输入] 3 [样例输出] 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 [问题分析] 这题要求输出n个数的全排列(从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列.当m=n时所有的排列情况叫全排列). 显然也没有什

一个能将给定非负整数数组中的数字排列成最大数字的函数

最近在网上看到这样一个题目,自己琢磨了一下. java version "1.8.0_40" // 编写一个能将给定非负整数数组中的数字排列成最大数字的函数. // 例如,给定[50,2,1,9],最大数字为95021. public class Sort { public static void main(String args[]){ int number[] = {1,2,3,32,335,34,7,6,9}; int number1[] = {312,321,3354,222,

数字排列问题

贵有恒,何必三更起五更眠:最无益,莫过一日曝十日寒. 数字排列问题 时间限制: 1 Sec  内存限制: 128 MB 题目描述 列出所有从数字1到数字n的连续自然数的排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入 n(1≤n≤9) 输出 由1~n组成的所有不重复的数字序列,每行一个序列. 样例输入 3 样例输出 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 用了next_permutation()函数字典序排列,对应的有一个排序顺序相反的函数prev_p

回溯---数字键盘组合

数字键盘组合 17. Letter Combinations of a Phone Number (Medium) Input:Digit string "23" Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]. 题目描述: ??根

蓝桥杯 - 数字排列(今有7对数字) - [DFS]

今有7对数字:两个1,两个2,两个3,...两个7,把它们排成一行.要求,两个1间有1个其它数字,两个2间有2个其它数字,以此类推,两个7之间有7个其它数字.如下就是一个符合要求的排列: 17126425374635 当然,如果把它倒过来,也是符合要求的. 请你找出另一种符合要求的排列法,并且这个排列法是以74开头的. 注意:只填写这个14位的整数,不能填写任何多余的内容,比如说明注释等. 答案: 74151643752362 解法1: 按照n=1~7进行DFS:我们每次尝试在当前存在的若干空位

数字排列

今有7对数字:两个1,两个2,两个3,...两个7,把它们排成一行.要求,两个1间有1个其它数字,两个2间有2个其它数字,以此类推,两个7之间有7个其它数字.如下就是一个符合要求的排列: 17126425374635 当然,如果把它倒过来,也是符合要求的. 请你找出另一种符合要求的排列法,并且这个排列法是以74开头的. 注意:只填写这个14位的整数,不能填写任何多余的内容,比如说明注释等. 答案: 代码: #include <iostream> #include <cstdio>

算法设计与分析 5.3 数字排列

★题目描述 给两个正整数A和B,请问通过重新排列A获得小于或等于B的最大数字是多少(不含前导0)? ★输入格式 输入的第一行两个数字A和B,保证这两个数字在int范围内. ★输出格式 输出A重新排列后小于或等于B的最大整数(不含前导0),若不存在输出-1. ★样例输入 1234 3456 ★样例输出 3421 ★提示 无 ★参考代码 /* 全排列用 prev_permutation 函数实现 */ /* 全排列用 prev_permutation 函数实现 string转int用 atoi 函数

九宫格数独--回溯法

数独顾名思义——每个数字只能出现一次.数独是一种源自18世纪末的瑞士,后在美国发展.并在日本得以发扬光大的数字谜题.数独盘面是个九宫,每一宫又分为九个小格.在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字.使1-9每个数字在每一行.每一列和每一宫中都只出现一次. 这种游戏全面考验做题者观察能力和推理能力,虽然玩法简单,但数字排列方式却千变万化,所以不少教育者认为数独是训练头脑的绝佳方式. 九宫格的游戏在很多地方都经常出现,比如手机,电脑等等,下面就以简单

用递归写排列组合问题

最近递归弄的人头疼,但是这两天看过来也稍微总结了一些不能称得上是技巧的技巧吧 问题如下,将1,2,3,4这四个数字排列组合的输出来,看网上有个很二的方法吧,就是将10000以内的数全部输出再筛选,对此有点无语,但是程序倒是挺好编的,嘿嘿 回归到正题中,用递归的思想解决 (1)采用旋转数字的方法,当步长为1时,1234还是1234,步长为2的时候,1234可以变为1243.1324...,步长为3 的时候,1234可以变为1423,诸如此类,最重要的能体现递归的就是将每次递归一次的数字还可以接着旋