首先贴出原参考答案,出处不详。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define STUDENT_NUM 50
int student[STUDENT_NUM] = {0};
bool IsInSet(int pos, int number) // bool 表达式。 作用是判断学生number 是否已分配过座位position。
{
for (int i = 0; i < pos; i++)
{
if (student[i] == number)
{
return true;
}
}
return false;
}
void RandSeat(int pos) // position随机分配studentNum函数
{
if (pos == STUDENT_NUM)
{
return;
}
srand((unsigned int)time(NULL)); // 随机种子
int studentNum = rand() % STUDENT_NUM + 1;
while (IsInSet(pos, studentNum) || (pos > 0 && (studentNum == student[pos - 1] + 1 || studentNum == student[pos - 1] - 1))) // 判断, 分配的这个studentNum是否无效,
// 1. 是否之前分配过,2. 是否与上一个position的studentNum相邻
{
studentNum = rand() % STUDENT_NUM + 1;
}
student[pos] = studentNum;
RandSeat(pos + 1);
}
int main()
{
RandSeat(0);
for(int i = 0; i < STUDENT_NUM; i++)
{
printf("%d\n", student[i]);
}
getchar();
return 0;
}
该代码未解决最后一个数可能与倒数第二个数相邻问题。
本人的代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
int a[10];
int i,j;
for(i=0;i<10;i++)
a[i]=i;
srand((unsigned)time(NULL));
for(i=0,j=rand() % 10 + 1;i<10;i++){
printf("%d ",a[j]);
j=(j+3)%10;
}
}
暂且认为小小一道笔试题不太可能用那么多行代码吧。有待考量。
p,s 递归实现全排列
void full_permutation(char *a, int pos, int last, FILE *fp)
{
int i;
if (pos == last) {
if (m_judge(a, last)) {
fwrite(a, sizeof(char), last+1, fp);
fwrite("\n", 1, 1, fp);
//m_print(a, last);
//printf("\n");
}
} else {
for(i = pos; i <= last; i ++) {
m_swap(a+i, a+pos);
full_permutation(a, pos+1, last, fp);
m_swap(a+i, a+pos);
}
}
}