YZM的全排列
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的全排列的更多相关文章
- PHP实现全排列(递归算法)
算法描述:如果用P表示n个元素的全排列,而Pi表示n个元素中不包含元素i的全排列,(i)Pi表示在排列Pi前面加上前缀i的排列,那么n个元素的全排列可递归定义为: ① 如果n=1,则排列P只有一 ...
- hdu5651 xiaoxin juju needs help (多重集的全排列+逆元)
xiaoxin juju needs help 题意:给你一个字符串,求打乱字符后,有多少种回文串. (题于文末) 知识点: n个元素,其中a1,a2,··· ...
- [LeetCode] Palindrome Permutation II 回文全排列之二
Given a string s, return all the palindromic permutations (without duplicates) of it. Return an empt ...
- [LeetCode] Palindrome Permutation 回文全排列
Given a string, determine if a permutation of the string could form a palindrome. For example," ...
- [LeetCode] Permutations II 全排列之二
Given a collection of numbers that might contain duplicates, return all possible unique permutations ...
- [LeetCode] Permutations 全排列
Given a collection of numbers, return all possible permutations. For example,[1,2,3] have the follow ...
- 全排列算法的JS实现
问题描述:给定一个字符串,输出该字符串所有排列的可能.如输入“abc”,输出“abc,acb,bca,bac,cab,cba”. 虽然原理很简单,然而我还是折腾了好一会才实现这个算法……这里主要记录的 ...
- java实现全排列
前天上午的面试遇到了一个用java实现一串数字的全排列的题,想来想去用递归最方便,可是没有在规定的时间内完成555,今天上午有空便继续写,以下是完成后的代码: import java.util.Arr ...
- poj3187-Backward Digit Sums(枚举全排列)
一,题意: 输入n,sum,求1~n的数,如何排列之后,相邻两列相加,直到得出最后的结果等于sum,输出1~n的排列(杨辉三角) 3 1 2 4 //1~n 全排列中的一个排列 4 3 6 7 ...
随机推荐
- Ubuntu-1404 GDB 调试C++报错
问题 Ubuntu1404下,当用GDB调试C++程序时,报错ImportError: No module named 'libstdcxx' 解决办法 vim ~/.gdbinit #~/.gdbi ...
- [LeetCode]题解(python):041-First Missing Positive
题目来源 https://leetcode.com/problems/first-missing-positive/ Given an unsorted integer array, find the ...
- 【python】numpy array特殊数据统一处理
array中的某些数据坏掉,想要统一处理,找到了这个方法,做个笔记. 比如,把数组中所有小于0的数字置为0 import numpy as np t = np.array([-2, -1, 0, 1, ...
- jQuery获取自身HTML
<html><head> <title>jQuery获取自身HTML</title> <meta http-equiv="Content ...
- android studio 0.8.11 如何导入Library(新手向)
网上下了个ViewPagerIndicator的库,下载下来是个zip包,解压开来,里面有一个library和一个sample文件夹,还有一些其他的配置文件. 其中library就是我们新项目中要引入 ...
- iOS系统自带正则表达式简单运用
//组装一个字符串,把里面的网址解析出来 NSString *urlString = @"sfdshttp://www.baidu.com"; NSError *error; // ...
- bootstrap响应式布局简单实例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- 在虚拟机中安装Ubuntu Server 15.04
学Linux,上红联! 红联Linux门户|Linux通用技术|Linux发行版技术|Linux企业应用|Linux实验室|红联Linux论坛 Linux系统教程 Linux入门 Linux管理 Li ...
- python字典循环小点
对于字典数据量不大时候 首先会将字典转换成列表,写到内存,如果几百万条,就会减慢速度 for k,v in dic:print k,v 可以这样 for k in dic:print k,dic[ ...
- 转 awk中RS,ORS,FS,OFS区别与联系
今天用到awk ofs 看到一篇不错文章 awk中RS,ORS,FS,OFS区别与联系 张映 发表于 2010-12-02 分类目录: shell 标签:awk, FS, OFS, ORS, RS, ...