设计算法 并用C语言描述 有没有大佬帮忙解答谢谢谢谢
设有n个人站成一排,从左向右的编号分别为1~n,现在从左往右报数“1,2,1,2……”,数到“1”的人出列,数到“2”的立即站到队伍的最右端。报数过程反复进行,直到n个人...
设有n个人站成一排,从左向右的编号分别为1~n,现在从左往右报数“1,2,1,2……”,数到“1”的人出列,数到“2”的立即站到队伍的最右端。报数过程反复进行,直到n个人都出列为止。要求给出他们的出列顺序。 例如:n=8,初始序列:1,2,3,4,5,6,7,8 出队顺序为:1,3,5,7,2,6,4,8
展开
2个回答
展开全部
#include <stdio.h>
void T1(int total,int out[]){
int data[total*2+1];//最多只需要两倍的宽度即可
int i,j;
for(i=0;i<total*2;i++){
if(i<total) data[i]=i+1;
else data[i]=-1;
}
int o=0;
int last=total;//最后指针,指向队尾后面的空位
//打印当前队列情况
for(j=0;j<total*2;j++){
if(data[j]!=-1)printf(" %d",data[j]);
}
printf("\n");
//打印完毕
int count=0;//序号
for(i=0;i<total*2;i++){
if(data[i]!=-1){//尚未出列
count++;//当前序号加一
if(count % 2 == 1){//叫到1
out[o]=data[i];//出列
o++;//出列指针加一
data[i]=-1;//当前位置设为空,不能再被叫到
}
else{//叫到2
data[last]=data[i];//移到最后
last++;//最后指针指向下一个空位置
data[i]=-1;//当前位置设为空,不能再被叫到
//打印当前队列情况
for(j=0;j<total*2;j++){
if(data[j]!=-1)printf(" %d",data[j]);
}
printf("\n");
//打印完毕
}
}
}
}
main(int argc,char * argv[]){
int total=10;
int i;
if(argc>1){
total=atoi(argv[1]);
}
int out[total];
T1(total,out);
//打印出列顺序
printf("出列顺序:");
for(i=0;i<total;i++){
if(i>0)printf(",");
printf("%d",out[i]);
}
printf("\n");
}
输出结果如下架设13个人的队列
1 2 3 4 5 6 7 8 9 10 11 12 13
3 4 5 6 7 8 9 10 11 12 13 2
5 6 7 8 9 10 11 12 13 2 4
7 8 9 10 11 12 13 2 4 6
9 10 11 12 13 2 4 6 8
11 12 13 2 4 6 8 10
13 2 4 6 8 10 12
4 6 8 10 12 2
8 10 12 2 6
12 2 6 10
6 10 2
2 10
10
出列顺序:1,3,5,7,9,11,13,4,8,12,6,2,10
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询