| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 994 人关注过本帖
标题:请高手指点一道c++问题
只看楼主 加入收藏
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
 问题点数:0 回复次数:3 
请高手指点一道c++问题

编写一个程序,提示用户输入一个数字n,然后输出1,2,3,...,n数字序列的所有排列组合,例如,如果n为3,则程序应输出: 1 2 3

1 3 2

2 1 3

2 3 1

3 1 2

3 2 1

2005-02-08 14:01
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
得分:0 

谢谢各位,我解出来了。。。。。。大家可否能对我的代码进行一下点评。。。 #include <iostream> #include <vector> #include <iomanip>

using namespace std;

const int PRINT_WIDTH = 4;

/* 构造数列 */ vector<int> construct_num_queue(int n);

/* 插入元素 */ void insert_element(vector<int>& v,int pos,int value); /* 排列组合 */ void permutation(vector<int> queue,vector<int> to_permute); /* 打印数列 */ void print_vector(const vector<int>& v);

int main() { int n; vector<int> n_queue; vector<int> permute(1); cout << "Please input n for permutation :"; cin >> n; if(cin.fail()) { cout << "Invailed input event occupied!" << endl; return 1; } if(n <= 0) { cout << "Value impossible!" << endl; return 1; }

n_queue = construct_num_queue(n); permutation(n_queue,permute);

return 0; }

vector<int> construct_num_queue(int n) { vector<int> result(n); for(int i = 0; i < n; i++) result[i] = i+1; return result; }

void insert_element(vector<int>& v,int pos,int value) { v.push_back(0); /* 扩充向量 */ int i; for(i = v.size() - 2; i >= pos; i--) v[i+1] = v[i]; v[pos] = value; }

void print_vector(const vector<int>& v) { for(int i = 0; i < v.size(); i++) cout << setw(PRINT_WIDTH) << v[i]; cout << endl; }

void permutation(vector<int> queue,vector<int> to_permute) { if(queue.size() == 0) { to_permute.pop_back(); /* 删除初始化的一项0 */ print_vector(to_permute); } else { vector<int> mir_queue = queue; /* 映射列队向量 */ vector<int> mir_to_permute = to_permute; /* 映射排列向量 */ vector<int> bak_vector; /* 备份向量 */

int back_value = mir_queue[mir_queue.size()-1]; /* 取出列队向量最后一个元素 */ mir_queue.pop_back(); /* 最后一个元素从向量中弹出 */ for(int i = 0; i < mir_to_permute.size(); i++) { /* 生成插孔的位置 */ bak_vector = mir_to_permute; /* 备份映射的队列向量 */ insert_element(mir_to_permute,i,back_value); permutation(mir_queue,mir_to_permute); /* 递归调用 */ mir_to_permute = bak_vector; /* 还原备份 */ } } }


我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2005-02-08 16:40
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
你的程序写的很不错,不过对内存开销太大。如果直接使用 STL ,可以写成类似下面的代码
#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;
#include &lt;string&gt;

using namespace std;


int main()
{
  int n, i;
  vector&lt;int&gt; num;
  cout &lt;&lt; "Please input n for permutation :";
  if(cin &gt;&gt; n &amp;&amp; n&gt;0)
  {
      for(i = 0; i&lt;n; i++)
          num.push_back(i+1);
      sort(num.begin(), num.end());
      for(i = 0; i&lt;n; i++)
          cout&lt;&lt;num.at(i)&lt;&lt;" ";
      cout&lt;&lt;endl;
      while(next_permutation(num.begin(), num.end()))
      {
          for(int i = 0; i&lt;n; i++)
              cout&lt;&lt;num[i]&lt;&lt;" ";
          cout&lt;&lt;endl;
      }
  }
  return 0;
}

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2005-02-09 08:36
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
得分:0 
感谢高手指点。。。。。。

我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2005-02-09 16:36
快速回复:请高手指点一道c++问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.053906 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved