该公司笔试题就1个,要求在10分钟内作完。
题目如下:用1、2、2、3、4、5这六个数字,写一个main函数,打印出所有不同的排列,
如:512234、412325等,要求:”4″不能在第三位,”3″与”5″不能相连。请问这题怎么做呢?
以前学过全排列的实现方法,但是记不太清,因为数据比较少,我用递归解决了;
答案组合很多,就不一一贴出了
代码:
#include
#include
#include
using namespace std;
struct node
{
int num,flag;
}a[6];
int db[10];
double number=0;
void Fun(int n,int sum,int before)
{
int i;
if((n==5&&before==3)||(n==5&&before==3))
return;
if(sum==6)
{
db[sum]=n;
if(db[3]==4)
return;
for(i=1;i printf("%d",db[i]);
puts("");
number++;
return;
}
db[sum]=n;
for(i=1;i {
if(a[i].flag==0)
{
a[i].flag=1;
Fun(a[i].num,sum+1,n);
a[i].flag=0;
}
}
return;
}
int main()
{
int i;
a[1].num=1;
a[2].num=2;
a[3].num=2;
a[4].num=3;
a[5].num=4;
a[6].num=5;
for(i=1;i a[i].flag=0;
for(i=1;i {
a[i].flag=1;
Fun(a[i].num,1,-1);
a[i].flag=0;
}
printf("一共有%.0lf种组合符合要求",number);
return 0;
}
最后一共有498种组合符合要求。
5个数一共有6*5*4*3*2*1=720种情况,看样子不符合情况的有720-498=222种
纯全排序代码:
#include
#include
#include
using namespace std;
struct node
{
int num,flag;
}a[6];
int db[10];
double number=0;
void Fun(int n,int sum,int before)
{
int i;
if(sum==6)
{
db[sum]=n;
for(i=1;i printf("%d",db[i]);
printf("n");
number++;
return;
}
db[sum]=n;
for(i=1;i {
if(a[i].flag==0)
{
a[i].flag=1;
Fun(a[i].num,sum+1,n);
a[i].flag=0;
}
}
return;
}
int main()
{
int i;
a[1].num=1;
a[2].num=2;
a[3].num=3;
a[4].num=4;
a[5].num=5;
a[6].num=6;
for(i=1;i a[i].flag=0;
for(i=1;i {
a[i].flag=1;
Fun(a[i].num,1,-1);
a[i].flag=0;
}
printf("一共有%.0lf种组合符合要求",number);
return 0;
}
1,2,3,4全排列测试结果:
1234
1243
1324
1342
1423
1432
2134
2143
2314
2341
2413
2431
3124
3142
3214
3241
3412
3421
4123
4132
4213
4231
4312
4321
一共有24种组合符合要求
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.e1idc.net