laifangsong's blog

取长补短,精益求精。 (打个广告,想做手机网站和asp/asp.net网站的可以跟我联系.QQ:25313644)
posts - 51, comments - 188, trackbacks - 0, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

排列组合问题。

Posted on 2006-10-16 16:40 laifangsong 阅读(583) 评论(7)  编辑 收藏 所属分类: 算法

<%

'算法程序题:
    '该公司笔试题就1个,要求在10分钟内作完。
    '题目如下:用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,
    '如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连
    

    
Dim i, i1, i2, i3, i4, i5, i6 '循环变量
    Dim t1, t2, t3, t4, t5 '临时变量
    Dim pre, cur '上一位,当前位
    Dim num '生成的数字串
    Dim appear(5'判断某个数字是否出现过的数组 例:appear(1)的值为0表示1没有出现过,值为1表示1出现过 

    pre 
= 0 '初始化为一个不相关的数字
    For i = 1 To 5
        appear(i) 
= 0
    
Next

    
    
For i1 = 1 To 5
        cur 
= i1
        
If Not(pre = 3 And cur = 5And Not(pre = 5 And cur = 3Then
            pre 
= cur
            
            
For i2 = 1 To 5
                t1 
= pre '保护pre的值,防止在下面的操作中值被改变
                cur = i2
                
If Not(pre = 3 And cur = 5And Not(pre = 5 And cur = 3Then
                    pre 
= cur
                    
                    
For i3 = 1 To 5
                        t2 
= pre
                        cur 
= i3
                        
If Not(pre = 3 And cur = 5And Not(pre = 5 And cur = 3Then
                            
If cur <> 4 Then
                                pre 
= cur
                                
                                
For i4 = 1 To 5
                                    t3 
= pre
                                    cur 
= i4
                                    
If Not(pre = 3 And cur = 5And Not(pre = 5 And cur = 3Then
                                        pre 
= cur
                                        
                                        
For i5 = 1 To 5
                                            t4 
= pre
                                            cur 
= i5
                                            
If Not(pre = 3 And cur = 5And Not(pre = 5 And cur = 3Then
                                                pre 
= cur
                                                
                                                
For i6 = 1 To 5
                                                    t5 
= pre
                                                    cur 
= i6
                                                    
If Not(pre = 3 And cur = 5And Not(pre = 5 And cur = 3Then
                                                        
                                                        appear(i1) 
= 1 '给出现过的数字打上标识
                                                        appear(i2) = 1
                                                        appear(i3) 
= 1
                                                        appear(i4) 
= 1
                                                        appear(i5) 
= 1
                                                        appear(i6) 
= 1

                                                        
If appear(1= 1 And appear(2= 1 And appear(3= 1 And appear(4= 1 And appear(5= 1 Then '组合成的结果中所有数字必须都出现过
                                                            num = i1 & i2 & i3 & i4 & i5 & i6
                                                            response.write num 
& "<br />"
                                                            num 
= ""
                                                        
End If
                                                        
For i = 1 To 5
                                                            appear(i) 
= 0
                                                        
Next

                                                    
End If
                                                    pre 
= t5
                                                
Next

                                            
End If
                                            pre 
= t4
                                        
Next
                                        
                                    
End If
                                    pre 
= t3
                                
Next

                            
End If
                        
End If
                        pre 
= t2
                    
Next

                
End If
                pre 
= t1 '还原pre的值
            Next

        
End If

        pre 
= 0 '还原pre的值
    Next
    

%
>

Feedback

#1楼    回复  引用  查看    

2006-10-16 16:44 by dudu      
首页从来不允许这样提问!

#2楼 [楼主]   回复  引用  查看    

2006-10-16 16:45 by laifangsong      
多谢dudu提示,我先移走。

#3楼    回复  引用    

2006-10-16 16:46 by jun[匿名] [未注册用户]
dudu 真够块的。

#4楼 [楼主]   回复  引用  查看    

2006-10-16 16:51 by laifangsong      
刚想移走已经被移了。

快,实在是快。

#5楼    回复  引用  查看    

2006-10-16 21:46 by Michael-_-Young      
偶只看到满页的if for end if next ....

#6楼    回复  引用    

2006-10-17 09:57 by liujioure [未注册用户]
//C++代码
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
using namespace std;

bool Jd35joind(int *a)
{
for(int i=0; i<5; i++)
{
if(a[i]+a[i+1]==8)
return true;
}
return false;
}

int main()
{

int A[] = {1,2,2,3,4,5};
int temp=1;
const int N = sizeof(A) / sizeof(int);
while(true)
{
if(temp!=A[0])
{
temp++;
if(temp>5)
break;
}
next_permutation(A, A+N);

if(A[2]!=4 && !Jd35joind(A))
{

copy(A, A+N, ostream_iterator<int>(cout, " "));
cout<<endl;
}

}
return 0;
}

#7楼 [楼主]   回复  引用  查看    

2006-10-17 11:01 by laifangsong      
谢谢 liujioure。

你的代码简练,专业。
有疑问:
next_permutation?(是一个递归函数吗)
ostream_iterator 是什么意思。

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
博客园首页

新闻频道

社区

小组

博问

网摘

闪存

  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-10-17 15:16 编辑过
成果网帮您增加网站收入


相关链接: