首页 新闻 会员 周边 捐助

遇到一个算法题,没什么好的思路。求助!

0
悬赏园豆:120 [已关闭问题] 关闭于 2014-11-11 23:19

给出一个正整数n(n>=3),有形如于1,1,2,2,3,3,.....,n,n的总计2n个数字的数字组合,他们满足条件:
在两个1之间有一个数字
在两个2之间有两个数字
在两个3之间有三个数字
......
在两个n之间有n个数字
写一个函数,打印出所有的满足条件的数字组合。

例如,当n==3时,有两个组合312132和231213

idbord的主页 idbord | 菜鸟二级 | 园豆:202
提问于:2014-11-11 19:24
< >
分享
所有回答(1)
0

 private void compute(int curVal)         {             //填写结束,判断结果,退出递归             if (curVal == 0)             {                 if (isOk())                 {                     outPut();                 }                 else                 {                     emptyIt();                 }                 return;             }             //每个数可以填写的位置             for (int i = 0; i < 2*n - curVal -1; i++)             {                 if (fillIt(i, curVal))                 {                     compute(curVal - 1);                 }             }         }

硬盘很大 | 园豆:16 (初学一级) | 2014-11-12 08:23

公司不能上传代码。只上传了上面的函数。

递归搜索方法,已得出,1000以内,只有当n=3时有这样的数。

isOK() --- 判断字符串是否满足要求

emptyIt()---清空串。

 //每一对填一次空         private bool fillIt(int firstPos,int val)         {             int secondPos = firstPos + val + 1;             //到尾了,不能填写了。             if (list.Count <= secondPos)             {                 return false;             }             //两个都是空位,可以填写。             if (list[firstPos] == -1 && list[secondPos] == -1)             {                 list[firstPos] = val;                 list[secondPos] = val;                 return true;             }             return false;         }

支持(0) 反对(0) 硬盘很大 | 园豆:16 (初学一级) | 2014-11-12 08:25

@硬盘很大: 把上面代码自己补齐就可以了。已测。

支持(0) 反对(0) 硬盘很大 | 园豆:16 (初学一级) | 2014-11-12 08:24

@硬盘很大: 初始化一个2 * n 大小的list,然后填数。

从大往小填。

先填写n,

从0位置往后填,n的位置就是 0, 0+n+1.以此类推。

支持(0) 反对(0) 硬盘很大 | 园豆:16 (初学一级) | 2014-11-12 08:28

@硬盘很大: 把分给我

支持(0) 反对(0) 硬盘很大 | 园豆:16 (初学一级) | 2014-11-12 08:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册