【試練】某公司麵試試題
該公司筆試題就1個,要求在10分鍾內作完。
題目如下:用1、2、2、3、4、5這六個數字,寫一個main函數,打印出所有不同的排列,
如:512234、412325等,要求:"4"不能在第三位,"3"與"5"不能相連。請問這題怎麼做呢?
以前學過全排列的實現方法,但是記不太清,因為數據比較少,我用遞歸解決了;
答案組合很多,就不一一貼出了
代碼:
#include<stdio.h>
#include<string.h>
#include<algorithm>
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<=6;i++)
printf("%d",db[i]);
puts("");
number++;
return;
}
db[sum]=n;
for(i=1;i<=6;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<=6;i++)
a[i].flag=0;
for(i=1;i<=6;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<stdio.h>
#include<string.h>
#include<algorithm>
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<=6;i++)
printf("%d",db[i]);
printf("\n");
number++;
return;
}
db[sum]=n;
for(i=1;i<=6;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<=6;i++)
a[i].flag=0;
for(i=1;i<=6;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種組合符合要求
最後更新:2017-04-03 12:56:20