50073081 YZM的全排列

【试题描述】

一天,老师给可怜的YZM出了一道题:写出1~n的全排列。YZM写了一天也没写出来。请你帮帮快跪的YZM,输出1~n的全排列。注:这里n为9

【输入要求】

输入n

【输出要求】

1~n的全排列,每个一行

【输入实例】

2

 

【输出实例】

12
21

【其他说明】

不允许使用内部函数,也不许直接输出。题目由wxjor提供。
wxjor温馨提示:n<=9

【试题分析】

这一题也是一道经典的不能再经典的dfs,但可能有些初学者不知道DFS,我就讲的细一点点。我们可以定义一个记录数的工具step,一开始step从1开始。如果step超过了n,那么证明这行排列排列完毕了。然后依次输出,别忘记输出回车!然后结束这次DFS。代码如下:

if(n+1==step)//当n+1==step代表step超过了n
{
for(int j=1;j<=n;j++) printf("%d",a[j]);//挨个输出
printf("\n");//一定要回车
return ;//结束这行的DFS
}

大家想一想,还差什么呢?

当然,差for(int i=1;i<=n;i++)这层循环,还有吗?

我们来看一下,为什么上面的样例中没有给出11和22,难道是题错了?

注意这一点:全排列是不能有重复的。

那么,怎么知道这个数以前处没出现过呢?

我们可以定义一个book数组,如果i出现了,那么把book[i]表为1。

for循环代码:

for(i=1;i<=n;i++)//从一到n循环
if(book[i]==0)//如果没有出现过
{
a[step]=i;//第step部是i
book[i]=1;//标记为出现过
dfs(step+1);//遍历下一步
book[i]=0;//标记为未出现过,因为下一个排列要使用
}

dfs整体代码:

void dfs(int step)
{
int i;
if(n+1==step)
{
for(int j=1;j<=n;j++) printf("%d",a[j]);
printf("\n");
return ;
}
for(i=1;i<=n;i++)
if(book[i]==0)
{
a[step]=i;
book[i]=1;
dfs(step+1);
book[i]=0;
}
}

然后int main()。

输入n。

dfs(?)。

从几开始呢?

我们说,通常情况下,都是从1开始的。

来看看为什么我们这题是从1开始?因为我们是从step=1时来弄的。

【代码】

#include<iostream>
#include<fstream>
using namespace std;
int a[10],book[10],n;
void dfs(int step)
{
int i;
if(n+1==step)
{
for(int j=1;j<=n;j++) printf("%d",a[j]);
printf("\n");
return ;
}
for(i=1;i<=n;i++)
if(book[i]==0)
{
a[step]=i;
book[i]=1;
dfs(step+1);
book[i]=0;
}
}
int main()
{
scanf("%d",&n);
dfs(1);
}

YZM的全排列的更多相关文章

  1. PHP实现全排列(递归算法)

    算法描述:如果用P表示n个元素的全排列,而Pi表示n个元素中不包含元素i的全排列,(i)Pi表示在排列Pi前面加上前缀i的排列,那么n个元素的全排列可递归定义为:    ① 如果n=1,则排列P只有一 ...

  2. hdu5651 xiaoxin juju needs help (多重集的全排列+逆元)

    xiaoxin juju needs help 题意:给你一个字符串,求打乱字符后,有多少种回文串.                      (题于文末) 知识点: n个元素,其中a1,a2,··· ...

  3. [LeetCode] Palindrome Permutation II 回文全排列之二

    Given a string s, return all the palindromic permutations (without duplicates) of it. Return an empt ...

  4. [LeetCode] Palindrome Permutation 回文全排列

    Given a string, determine if a permutation of the string could form a palindrome. For example," ...

  5. [LeetCode] Permutations II 全排列之二

    Given a collection of numbers that might contain duplicates, return all possible unique permutations ...

  6. [LeetCode] Permutations 全排列

    Given a collection of numbers, return all possible permutations. For example,[1,2,3] have the follow ...

  7. 全排列算法的JS实现

    问题描述:给定一个字符串,输出该字符串所有排列的可能.如输入“abc”,输出“abc,acb,bca,bac,cab,cba”. 虽然原理很简单,然而我还是折腾了好一会才实现这个算法……这里主要记录的 ...

  8. java实现全排列

    前天上午的面试遇到了一个用java实现一串数字的全排列的题,想来想去用递归最方便,可是没有在规定的时间内完成555,今天上午有空便继续写,以下是完成后的代码: import java.util.Arr ...

  9. poj3187-Backward Digit Sums(枚举全排列)

    一,题意: 输入n,sum,求1~n的数,如何排列之后,相邻两列相加,直到得出最后的结果等于sum,输出1~n的排列(杨辉三角)  3 1 2 4 //1~n 全排列中的一个排列  4 3 6  7 ...

随机推荐

  1. Ubuntu-1404 GDB 调试C++报错

    问题 Ubuntu1404下,当用GDB调试C++程序时,报错ImportError: No module named 'libstdcxx' 解决办法 vim ~/.gdbinit #~/.gdbi ...

  2. [LeetCode]题解(python):041-First Missing Positive

    题目来源 https://leetcode.com/problems/first-missing-positive/ Given an unsorted integer array, find the ...

  3. 【python】numpy array特殊数据统一处理

    array中的某些数据坏掉,想要统一处理,找到了这个方法,做个笔记. 比如,把数组中所有小于0的数字置为0 import numpy as np t = np.array([-2, -1, 0, 1, ...

  4. jQuery获取自身HTML

    <html><head> <title>jQuery获取自身HTML</title> <meta http-equiv="Content ...

  5. android studio 0.8.11 如何导入Library(新手向)

    网上下了个ViewPagerIndicator的库,下载下来是个zip包,解压开来,里面有一个library和一个sample文件夹,还有一些其他的配置文件. 其中library就是我们新项目中要引入 ...

  6. iOS系统自带正则表达式简单运用

    //组装一个字符串,把里面的网址解析出来 NSString *urlString = @"sfdshttp://www.baidu.com"; NSError *error; // ...

  7. bootstrap响应式布局简单实例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  8. 在虚拟机中安装Ubuntu Server 15.04

    学Linux,上红联! 红联Linux门户|Linux通用技术|Linux发行版技术|Linux企业应用|Linux实验室|红联Linux论坛 Linux系统教程 Linux入门 Linux管理 Li ...

  9. python字典循环小点

    对于字典数据量不大时候   首先会将字典转换成列表,写到内存,如果几百万条,就会减慢速度 for k,v in dic:print k,v 可以这样 for k in dic:print k,dic[ ...

  10. 转 awk中RS,ORS,FS,OFS区别与联系

     今天用到awk ofs 看到一篇不错文章 awk中RS,ORS,FS,OFS区别与联系 张映 发表于 2010-12-02 分类目录: shell 标签:awk, FS, OFS, ORS, RS, ...