免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2234 | 回复: 9
打印 上一主题 下一主题

[C++] 请教个排列算法 [复制链接]

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-03-17 08:59 |只看该作者 |倒序浏览
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
2 [报告]
发表于 2014-03-17 11:09 |只看该作者
假设有 n 行,各行分别有 a1、a2、a3 …… an 个数据
for( 整型 i=0; i!=a1*a2*a3……*an; ++i )
{
       第一行取第 i / (a2*a3……*an) 个数据
       第二行取第 i % (a2*a3……*an)/(a3……*an) 个数据
       ……
}
这样比较简单,但如果 a1*a2*a3……*an 太大的话,没有这样的内置整型能容纳下

另一种,就是自己做个栈
{第一行当前索引,第一行最大索引}
{第二行当前索引,第二行最大索引}
……

论坛徽章:
1
技术图书徽章
日期:2014-03-06 15:32:30
3 [报告]
发表于 2014-03-17 11:20 |只看该作者
1、用递归
2、模拟递归,作个长度等于行数的整数数组,每个数组元素是对应行的循环计数。

论坛徽章:
1
技术图书徽章
日期:2014-03-06 15:32:30
4 [报告]
发表于 2014-03-17 11:20 |只看该作者
1、用递归
2、模拟递归,作个长度等于行数的整数数组,每个数组元素是对应行的循环计数。

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
5 [报告]
发表于 2014-03-17 12:07 |只看该作者
吃饭回来,瞎写的,给你参考一下
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;

  4. int main()
  5. {
  6.     // 输入
  7.     vector< vector<int> > buf;
  8.     {
  9.         vector<int> tmp;
  10.         tmp.push_back( 1 );
  11.         tmp.push_back( 2 );
  12.         buf.push_back( tmp );

  13.         tmp.clear();
  14.         tmp.push_back( 44 );
  15.         tmp.push_back( 55 );
  16.         tmp.push_back( 66 );
  17.         buf.push_back( tmp );

  18.         tmp.clear();
  19.         tmp.push_back( 88 );
  20.         tmp.push_back( 99 );
  21.         buf.push_back( tmp );
  22.     }

  23.     // 输出
  24.     if( !buf.empty() )
  25.     {
  26.         vector<size_t> pro( buf.size(), 0 );

  27.         for( ; pro.front() != buf.front().size(); )
  28.         {
  29.             for( size_t i=0; i!=pro.size(); ++i )
  30.                 cout << buf[i][pro[i]] << ' ';
  31.             cout << '\n';

  32.             // next
  33.             for( size_t i=pro.size(); i!=0; --i )
  34.             {
  35.                 if( pro[i-1]+1!=buf[i-1].size() || i-1==0 )
  36.                 {
  37.                     ++pro[i-1];
  38.                     break;
  39.                 }
  40.                 else if( i-1 != 0 )
  41.                 {
  42.                     pro[i-1] = 0;
  43.                 }
  44.             }
  45.         }
  46.     }

  47.     return 0;
  48. }
复制代码

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
6 [报告]
发表于 2014-03-17 12:27 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
7 [报告]
发表于 2014-03-17 14:29 |只看该作者
这个好办, 两个Loop就好了
原始数据:
1 2
44 555 66
88 9
有三行数据,设一个长度为两3的数组:
一个表示长度: 2 3 2
一个表示当前计数
0 0 0
当前计数加1,直到 121为止~
算法如下:
  1. #include <vector>
  2. #include <stdio.h>
  3. void permulation_next(const std::vector<std::vector<int>>& meta, std::vector<int>& ic){
  4.         // +1
  5.         int icarry =1;
  6.         for(size_t irow =0; irow <meta.size(); irow++){
  7.                 int iv =icarry +ic[irow];
  8.                 ic[irow] =iv;
  9.                 if(iv ==(int)meta[irow].size()){
  10.                         icarry =1;
  11.                         ic[irow] =0;
  12.                 }else{
  13.                         icarry =0;
  14.                         break;
  15.                 }
  16.         }
  17. }

  18. int main(){
  19.         int params[][3]={
  20.                 {1,2,},
  21.                 {44, 555, 66,},
  22.                 {88, 9,},
  23.         };
  24.         int nlen[] ={2,3,2};

  25.         std::vector<std::vector<int>> meta;
  26.         for(int irow =0; irow <_countof(params); irow ++){
  27.                 std::vector<int> rows;
  28.                 for(int iitem =0; iitem <nlen[irow]; iitem++){
  29.                         rows.push_back(params[irow][iitem]);
  30.                 }
  31.                 meta.push_back(rows);
  32.         }

  33.         std::vector<int> ic;
  34.         int nloops =1;
  35.         for(int irow =0; irow <_countof(params); irow++){
  36.                 ic.push_back(0);
  37.                 nloops *=nlen[irow];
  38.         }

  39.         for(int iloop =0; iloop <nloops; iloop++){
  40.                 for(size_t irs =0; irs <ic.size(); irs++){
  41.                         printf("%d ",meta[irs][ic[irs]]);
  42.                 }
  43.                 puts(" --");
  44.                 permulation_next(meta,ic);
  45.         }

  46.         return 0;
  47. }
复制代码

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
8 [报告]
发表于 2014-03-17 14:33 |只看该作者
回复 5# bruceteen
**nb,8741

   

论坛徽章:
5
寅虎
日期:2014-01-01 12:56:09未羊
日期:2014-01-02 17:57:59未羊
日期:2014-01-05 10:18:05双子座
日期:2014-01-05 13:04:07双鱼座
日期:2014-01-10 17:40:33
9 [报告]
发表于 2014-03-18 00:39 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
5
寅虎
日期:2014-01-01 12:56:09未羊
日期:2014-01-02 17:57:59未羊
日期:2014-01-05 10:18:05双子座
日期:2014-01-05 13:04:07双鱼座
日期:2014-01-10 17:40:33
10 [报告]
发表于 2014-03-18 00:45 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP