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 ...
随机推荐
- (转载)C++文件读写函数之——fopen、fread和fwrite、fgetc和fputc、fgets和fputs、ftellf和fseek、rewind
http://blog.sina.com.cn/s/blog_61437b3b0102v0bt.html http://blog.csdn.net/chenwk891/article/details/ ...
- Selenium2学习-019-WebUI自动化实战实例-017-获取浏览器类型
Web UI 自动化脚本分布执行过程中有时候需要获取浏览器的相关信息,此文给出了一个简略获取浏览器类型的方法,敬请各位小主们参阅.若有不足之处,敬请大神指正,不胜感激! 闲话少述,上码. /** * ...
- [转]获得 LayoutInflater 实例的三种方式
转自:http://www.cnblogs.com/androidez/archive/2013/07/01/3164729.html 获得 LayoutInflater 实例的三种方式 在实际开 ...
- SqlServer基础:IsNull
SELECT @temp = ISNULL(point, 0) FROM dbo.User where Nid=6 如果User表中的point字段为null的话,则对@temp赋值0
- winston 日志管理4
配置File Transport winston.add(winston.transports.File, options) The File transport should really be t ...
- axis2 WebService的发布与调用
1:准备: JDK:http://www.oracle.com/technetwork/java/javase/downloads/jdk6downloads-1902814.html e ...
- saltstack故障解决
[root@saltstack_s ~]# salt '*' test.pingSalt request timed out. The master is not responding. If thi ...
- LED_9261在linux2.6.30中tick_led的实现
在linux2.6.30内核中,内核也提供了相关的平台驱动来操作gpio或LED,但更简便的方法是直接操作GPIO来控制led. 网上一博文中介绍直接封装led_on和led_off()函数直接调用即 ...
- canvas保存为data:image扩展功能的实现
[已知]canvas提供了toDataURL的接口,可以方便的将canvas画布转化成base64编码的image.目前支持的最好的是png格式,jpeg格式的现代浏览器基本也支持,但是支持的不是很好 ...
- Hadoop学习笔记: HDFS
注:该文内容部分来源于ChinaHadoop.cn上的hadoop视频教程. 一. HDFS概述 HDFS即Hadoop Distributed File System, 源于Google发表于200 ...