华师一附中OI组

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

P1157 组合的输出

[复制链接]

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
跳转到指定楼层
楼主
发表于 2018-5-10 12:04:45 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
题目描述
排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r<=n),我们可以简单地将n个元素理解为自然数1,2,…,n,从中任取r个数。

现要求你不用递归的方法输出所有组合。

例如n=5,r=3,所有组合为:

l 2 3 l 2 4 1 2 5 l 3 4 l 3 5 1 4 5 2 3 4 2 3 5 2 4 5 3 4 5

输入输出格式
输入格式:
一行两个自然数n、r(1<n<21,1<=r<=n)。

输出格式:
所有的组合,每一个组合占一行且其中的元素按由小到大的顺序排列,每个元素占三个字符的位置,所有的组合也按字典顺序。

**注意哦!输出时,每个数字需要3个场宽,pascal可以这样:

write(ans:3);

输入输出样例
输入样例#1:
5 3
输出样例#1:
  1  2  3
  1  2  4
  1  2  5
  1  3  4
  1  3  5
  1  4  5
  2  3  4
  2  3  5
  2  4  5
  3  4  5
回复

使用道具 举报

0

主题

4

帖子

53

积分

注册会员

Rank: 2

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

使用道具 举报

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
18#
 楼主| 发表于 2018-6-27 11:34:54 来自手机 | 只看该作者
不要用dfs
回复

使用道具 举报

2

主题

105

帖子

306

积分

中级会员

Rank: 3Rank: 3

积分
306
17#
发表于 2018-6-25 19:31:02 | 只看该作者
  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[30],book[30],n,m;
  14. void dfs(int cnt,int la)
  15. {
  16.         if(cnt==m+1)
  17.         {
  18.             for(int i=1;i<=m;i++)
  19.                  printf("%3d",a[i]);
  20.             printf("\n");
  21.             return;
  22.         }
  23.         for(int i=la+1;i<=n;i++)
  24.             if(!book[i])
  25.             {
  26.                 book[i]=1,a[cnt]=i;
  27.                 dfs(cnt+1,i);
  28.                 book[i]=0;
  29.                 }
  30. }
  31. int main()
  32. {  
  33.     scanf("%d%d",&n,&m);
  34.     dfs(1,0);
  35.     return 0;
  36. }
复制代码
回复 支持 反对

使用道具 举报

0

主题

2

帖子

16

积分

新手上路

Rank: 1

积分
16
16#
发表于 2018-6-16 16:40:24 | 只看该作者
#include <iostream>
using namespace std;
int n,r;
bool x[10];
int a[10];
void  dfs(int i)
{
  
    if(i==r)
    {
        for(int q=0;q<r;q++) cout<<a[q]<<"   "; cout<<endl;
    }
    else
    {
        for(int j=1;j<=n;j++)   
        {
            if(x[j])
            {
                a[i]=j;
                if(i>0 && a[i-1]>a[i])
                continue;
                x[j]=false;
                dfs(i+1);
                x[j]=true;
            }
        }
    }
}
int main()
{
    cin>>n>>r;
    for(int ans=1;ans<=n;ans++)
    x[ans]=1;
    dfs(0);
    return 0;
}
回复 支持 反对

使用道具 举报

0

主题

17

帖子

82

积分

注册会员

Rank: 2

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

使用道具 举报

7

主题

27

帖子

91

积分

注册会员

Rank: 2

积分
91
14#
发表于 2018-5-20 13:48:44 | 只看该作者
  1. #include <cstdio>
  2. #include <vector>
  3. const int N = 100010;

  4. int stak[N], top, p; /// 模拟系统栈
  5. std::vector<int> v;

  6. inline void call(int x, int add) {
  7.     int pre_top = top;
  8.     stak[++top] = x;
  9.     stak[++top] = add;
  10.     stak[++top] = pre_top;
  11.     p = 0;
  12.     return;
  13. }

  14. inline void ret() {
  15.     p = stak[top - 1];
  16.     top = stak[top];
  17.     return;
  18. }

  19. int main() {
  20.     int n, m;
  21.     scanf("%d%d", &n, &m);
  22.     call(1, 0);
  23.     while(top) {
  24.         int x = stak[top - 2];
  25.         if(p == 0) {
  26.             if(v.size() == m) {
  27.                 for(int i = 0; i < v.size(); i++) {
  28.                     printf("%3d", v[i]);
  29.                 }
  30.                 printf("\n");
  31.                 ret(); /// return;
  32.                 continue;
  33.             }
  34.             if(x == n + 1 || v.size() + (n - x + 1) < m) {
  35.                 ret(); /// return;
  36.                 continue;
  37.             }
  38.             v.push_back(x);
  39.             call(x + 1, 1); /// DFS(x + 1);
  40.             continue;
  41.         }
  42.         else if(p == 1) {
  43.             v.pop_back();
  44.             call(x + 1, 2); /// DFS(x + 1);
  45.             continue;
  46.         }
  47.         else {
  48.             ret(); /// return;
  49.             continue;
  50.         }
  51.     }
  52.     return 0;
  53. }
复制代码
回复 支持 反对

使用道具 举报

7

主题

27

帖子

91

积分

注册会员

Rank: 2

积分
91
13#
发表于 2018-5-20 13:48:20 | 只看该作者
#include <cstdio>
#include <vector>
const int N = 100010;

int stak[N], top, p; /// 模拟系统栈
std::vector<int> v;

inline void call(int x, int add) {
    int pre_top = top;
    stak[++top] = x;
    stak[++top] = add;
    stak[++top] = pre_top;
    p = 0;
    return;
}

inline void ret() {
    p = stak[top - 1];
    top = stak[top];
    return;
}

int main() {
    int n, m;
    scanf("%d%d", &n, &m);
    call(1, 0);
    while(top) {
        int x = stak[top - 2];
        if(p == 0) {
            if(v.size() == m) {
                for(int i = 0; i < v.size(); i++) {
                    printf("%3d", v[i]);
                }
                printf("\n");
                ret(); /// return;
                continue;
            }
            if(x == n + 1 || v.size() + (n - x + 1) < m) {
                ret(); /// return;
                continue;
            }
            v.push_back(x);
            call(x + 1, 1); /// DFS(x + 1);
            continue;
        }
        else if(p == 1) {
            v.pop_back();
            call(x + 1, 2); /// DFS(x + 1);
            continue;
        }
        else {
            ret(); /// return;
            continue;
        }
    }
    return 0;
}
回复 支持 反对

使用道具 举报

2

主题

17

帖子

74

积分

注册会员

Rank: 2

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

使用道具 举报

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
11#
 楼主| 发表于 2018-5-17 10:41:38 | 只看该作者
对!YTC好样的 就是要这样的一个程序!!!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-2 06:25 , Processed in 0.137974 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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