华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4774|回复: 18
打印 上一主题 下一主题

P1706 全排列问题

[复制链接]

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
跳转到指定楼层
楼主
发表于 2018-5-10 12:06:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
题目描述
输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。

输入输出格式
输入格式:
n(1≤n≤9)

输出格式:
由1~n组成的所有不重复的数字序列,每行一个序列。每个数字保留5个常宽。

输入输出样例
输入样例#1:
3
输出样例#1:
    1    2    3
    1    3    2
    2    1    3
    2    3    1
    3    1    2
    3    2    1

回复

使用道具 举报

2

主题

105

帖子

306

积分

中级会员

Rank: 3Rank: 3

积分
306
推荐
发表于 2018-5-12 11:56:06 | 只看该作者
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cmath>
  4. #include <cstring>
  5. #include <map>
  6. #include <string>
  7. #include <vector>
  8. #include <queue>
  9. #include <stack>
  10. #include <cstdio>
  11. #include <cstdlib>
  12. using namespace std;
  13. int a[20],book[20],n;
  14. void dfs(int cnt)
  15. {
  16.         if(cnt==n+1)
  17.         {
  18.                 for(int i=1;i<=n;i++)
  19.                         printf("%5d",a[i]);
  20.                 printf("\n");
  21.                 return;
  22.         }
  23.         for(int i=1;i<=n;i++)
  24.                 if(!book[i])
  25.                 {
  26.                         book[i]=1,a[cnt]=i;
  27.                         dfs(cnt+1);
  28.                         book[i]=0;
  29.                 }
  30. }
  31. int main()
  32. {  
  33.         scanf("%d",&n);
  34.         dfs(1);
  35.     return 0;
  36. }
复制代码
回复 支持 1 反对 0

使用道具 举报

0

主题

8

帖子

56

积分

注册会员

Rank: 2

积分
56
板凳
发表于 2018-5-11 21:38:38 | 只看该作者
  1. #include <cstdio>
  2. #include <cstdlib>
  3. using namespace std;
  4. bool X[10];
  5. int q[10];
  6. int N;
  7. void dfs(int i)
  8. {
  9.         if(i==N)
  10.         {       
  11.                 for(int ii=0;ii<N;ii++)
  12.                         printf("%5d",q[ii]);
  13.                 printf("\n");
  14.                 return ;
  15.         }
  16.        
  17.         for(int j=1;j<=N;j++)
  18.         {
  19.                 if(!X[j])
  20.                 {
  21.                         q[i]=j;
  22.                         X[j]=true;
  23.                         dfs(i+1);
  24.                         X[j]=false;
  25.                 }
  26.         }
  27.        
  28.         return ;
  29. }
  30. int main()
  31. {
  32.         scanf("%d",&N);
  33.         dfs(0);
  34.        
  35.         return 0;
  36. }
复制代码
回复 支持 反对

使用道具 举报

1

主题

15

帖子

101

积分

注册会员

Rank: 2

积分
101
地板
发表于 2018-5-11 22:56:21 | 只看该作者

  1. #include<iostream>
  2. #include<iomanip>
  3. using namespace std;
  4. int A[10],n;
  5. void dfs(int n,int *A,int js){
  6.      if(js == n){
  7.         for(int i=0; i<n; i++)
  8.         cout<<setw(5)<<A[i];
  9.      cout<<endl;
  10.      return;
  11.      }
  12.      else for(int i=1; i<=n; i++){
  13.      bool ok = 1;
  14.         for(int j=0; j<js; j++)
  15.            if(A[j] == i) ok = 0;
  16.         if(ok){
  17.               A[js] = i;
  18.               dfs(n, A, js+1);
  19.         }
  20.      }
  21. }
  22. int main(){
  23.     cin>>n;
  24.     dfs(n, A, 0);
  25.     return 0;
  26. }
复制代码

回复 支持 反对

使用道具 举报

61

主题

147

帖子

563

积分

超级版主

Rank: 8Rank: 8

积分
563
5#
发表于 2018-5-11 23:22:21 来自手机 | 只看该作者
lyc
回复

使用道具 举报

9

主题

89

帖子

292

积分

华一学生

积分
292
6#
发表于 2018-5-13 17:26:57 | 只看该作者
  1. #include<iostream>
  2. #include<iomanip>
  3. using namespace std;
  4. int n,a[10],b[10];
  5. void dfs(int x)
  6. {
  7.     if (x>=n+1)
  8.     {
  9.         for (int i=1; i<=n; i++)
  10.             cout<<setw(5)<<a[i];
  11.         cout<<endl;
  12.         return;
  13.     }
  14.     else
  15.     {
  16.         for (int i=1; i<=n; i++)
  17.         {
  18.             if (b[i]==false)
  19.             {
  20.                 b[i]=true;
  21.                 a[x]=i;
  22.                 dfs(x+1);
  23.                 b[i]=false;
  24.             }
  25.         }
  26.     }
  27. }
  28. int main()
  29. {
  30.     cin>>n;
  31.     dfs(1);
  32.     return 0;
  33. }
复制代码
回复 支持 反对

使用道具 举报

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
7#
 楼主| 发表于 2018-5-13 17:59:01 来自手机 | 只看该作者
很好  基本的pmn 标准的算法
回复 支持 反对

使用道具 举报

9

主题

158

帖子

470

积分

华一学生

积分
470
QQ
8#
发表于 2018-5-13 20:17:31 | 只看该作者
  1. #include<iostream>
  2. #include<iomanip>
  3. using namespace std;
  4. int n,b[10],c[10],a[10]= {0,1,2,3,4,5,6,7,8,9};
  5. void ms(int i)
  6. {
  7.     if(i>n)
  8.     {
  9.         for(int j=1; j<i; j++)cout<<setw(5)<<c[j];
  10.         cout<<endl;
  11.     }
  12.     for(int k=1; k<=n; k++)
  13.         if(!b[k])
  14.         {
  15.             c[i]=a[k];
  16.             b[k]=1;
  17.             ms(i+1);
  18.             b[k]=0;
  19.         }
  20. }
  21. int main()
  22. {
  23.     cin>>n;
  24.     ms(1);
  25.     return 0;
  26. }
复制代码


diggersun: 你这个A[10] 是干什么用的?
回复 支持 反对

使用道具 举报

0

主题

30

帖子

91

积分

注册会员

Rank: 2

积分
91
9#
发表于 2018-5-13 21:22:22 | 只看该作者
  1. #include <cstdio>
  2. int a[10],n,book[10];
  3. void dfs(int step)
  4. {
  5.         if(step==n+1)
  6.         {
  7.                 for(int i=1;i<=n;i++)
  8.                         printf("%5d",a[i]);
  9.                 printf("\n");
  10.         }
  11.         else
  12.                 for(int i=1;i<=n;i++)
  13.                         if(book[i]==0)
  14.                         {
  15.                                 a[step]=i;
  16.                                 book[i]=1;
  17.                                 dfs(step+1);
  18.                                 book[i]=0;
  19.                                 a[step]=0;
  20.                         }
  21. }
  22. int main()
  23. {
  24.         scanf("%d",&n);
  25.         dfs(1);
  26.         return 0;
  27. }
复制代码

范彦廷提交
回复 支持 反对

使用道具 举报

2

主题

17

帖子

74

积分

注册会员

Rank: 2

积分
74
10#
发表于 2018-5-16 16:48:15 | 只看该作者
  1. #include<cstdio>
  2. const int maxn = 15;
  3. int n,c[maxn];
  4. void print(int cur){
  5.     if(cur == n){
  6.         for(int i = 0; i < n;i++)
  7.             printf("%5d",c[i]);
  8.         printf("\n");
  9.     }
  10.     else{
  11.         for(int i = 1;i <= n;i++){
  12.             int ok  = 1;
  13.             for(int j = 0;j < cur;j++){
  14.                 if(i == c[j]){ok = 0;break;}
  15.             }
  16.             if(ok){c[cur] = i;print(cur+1);}
  17.         }
  18.     }
  19. }
  20. int main(){
  21.     scanf("%d",&n);
  22.     print(0);
  23.     return 0;
  24. }

复制代码


注意精简自己的程序
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-12-25 02:06 , Processed in 0.174007 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表