[转帖子]求一算法实现

qidizi 2014-02-28 09:01:31
感觉c这边的算法应该比较利害,
帖子发布在js版块,求算法n人给一实现
可以是c语言或是伪代码,理顺循环或是递归即可,细节可不考虑.

我自己有一个写法但是感觉还不是很满意.
...全文
102 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
qidizi 2014-02-28
  • 打赏
  • 举报
回复
相同的实现,应该一样的结果,c不精通,就不修改了,结果可以看js版本的修改.呵 http://bbs.csdn.net/topics/390719905
baihacker 2014-02-28
  • 打赏
  • 举报
回复
#include <cstdio>
#include <cstring>
#include <bitset>
#include <iostream>
using namespace std;
#if 0
const int N = 4;
int cnt[N] = {4, 2, 5, 3};
const char* label = "abcd";
#else
const int N = 2;
int cnt[N] = {2, 2};
const char* label = "ab";
#endif
int temp[N];
int main()
{
	for (int size = N; size >= 1; --size)
	for (int mask = (1 << size) - 1; mask < 1 << N;)
	{
		int total = 1;
		for (int i = 0; i < N; ++i)
		if (mask & 1 << i)
		{
			temp[i] = total;
			total *= cnt[i];
		}
		for (int id = 0; id < total; ++id)
		{
			for (int j = 0; j < N; ++j)
			if (mask & 1 << j)
			{
				int v = id / temp[j] % cnt[j];
				printf("%c%d ", label[j], v+1);
			}
			puts("");
		}
		const int x = mask & - mask, y = mask + x;
		mask = ((mask & ~y) / x >> 1) | y;
	}
	return 0;
}
qidizi 2014-02-28
  • 打赏
  • 举报
回复
题目补充


如图结构,a-d各为一列,称之y轴(+y方向),a1,b1,c1,d1为x轴(+x方向);
数字1,2,3...可以称为行,数字叫行号,
字母abcd..称之为列,叫列名
排列要求:
有效元素个数:一组排列,元素最少时是一个,如[a1],元素个数最多时是列的个数个如,[a1,b2,c1,d3];
有效排列:同列名的某元素可以与其它列(或多列)中的任一个元素结合,但一个排列中,不允许同列名的元素出现,也就是排列时,只允许在一个列取一个元素;
有序排列:向右结合即可,如a1b1与b1a1是相同排列,可以说是组合弃用向左结合集.
排列出现顺序:元素最多->元素个数相同时先最左边元素结合再右边,先行号小结合再行号大的结合,也就是先多元素,后少元素,同元素时,从左到右,从下到上;
代码实现时,请尝试不需要按组合后的左右下上的大小值来比较排序,人工在代码实现时控制出现顺序?

如有数据
[
['a1','a2']
,['b1','b2']
]

出现顺序

a1 b1
a2 b1
a1 b2
a2 b2

以上组合可以看到第一个元素是变的,后面元素固定,第一个元素变完再变后面

a1
a2
b1
b2

以上是全部组合.
谢谢
AndyStevens 2014-02-28
  • 打赏
  • 举报
回复
贴题目啊。。。。

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧