Chinaunix首页 | 论坛 | 博客
  • 博客访问: 55565
  • 博文数量: 16
  • 博客积分: 650
  • 博客等级: 上士
  • 技术积分: 170
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-08 19:32
文章分类

全部博文(16)

文章存档

2008年(16)

我的朋友
最近访客

分类: C/C++

2008-08-19 20:04:31

  从M个数中取N个,打印所有的方式。在好多地方看到这个题作为笔试/面试题。
 
  挺简单的。
 

#include <iostream>

using namespace std;

#define M 5
#define N 3
int source[M] = {0};
int dest[N] = {0};
int s_index = 0;
int d_index = 0;

void display(int source[], int s_index, int dest[], int d_index, int num)
{
    // 如果在source[]中剩下的数正好是N个,则打印并返回;包括已经放入dest[]中的,现在已经不能再做选择,否则剩余的数不够N

    if(s_index + num == M)
    {
        for(int i=0; i<d_index; i++)
        {
            cout << dest[i] << " ";
        }
        for(int j=s_index; j<M; j++)
        {
            cout << source[j] << " ";
        }
        cout << endl;
        return;
    }

    // 如果最后只需从source[]中选1个,则遍历source[]剩下的数

    if(num == 1)
    {
        for(int i=s_index; i<M; i++)
        {
            for(int j=0; j<d_index; j++)
            {
                cout << dest[j] << " ";
            }
            cout << source[i] << endl;
        }
        return;
    }

    display(source, s_index+1, dest, d_index, num); // source[s_index]没选中,则在剩下的source[]中选num个

    dest[d_index++] = source[s_index++]; // 把选中的数放进dest[]中

    display(source, s_index, dest, d_index, num-1); // source[s_index]选中,则在剩下的source中继续选num-1个

}

void main()
{
    for(int i=0; i<M; i++)
    {
        source[i] = i + 1;
    }
    display(source, 0, dest, 0, N);
}

 
 
阅读(1092) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~