一队列有N个人,从第一位开始报数,报到3的人出列,后面的人继续从1开始报数,报到末尾后从头开始,如此反复。请确定最后一位是原队列中的第几个人。N的值为正整数。
看到这道题目,以前做过。现在来复习一下吧:
首先用结构体 和 循环单链表来做,最简单:
View Code
1 #include <stdio.h>
2 int N= 10;
3
4 struct PEOPLE{
5 int Number;
6 struct PEOPLE *next;
7 }*cur,*tmp;
8
9 int main(int argc,char **argv){
10 if(argc==2){
11 N=atoi(argv[1]);
12 }
13 struct PEOPLE head[N];
14 int out=3;
15 int ALL=N;//People
16 cur=head;//=malloc(sizeof(PEOPLE)*N);
17
18 int i=0;
19 printf("init\n");
20 for(;i<N;i++){
21 cur[i].Number=i+1;
22 cur[i].next=&cur[i+1];
23 printf("%d ",cur[i].Number);
24 }printf("\n");
25 cur[i-1].next=&cur[0];
26 i=0;tmp=cur=head;int count=0;
27 printf("Begin to play this game...\n");
28 while(1){
29 i++;
30 printf("I am %d ,my turn is :%d ",cur->Number,i);
31 if(i%3==0){
32 printf(",OK, i am 3,I will out");
33 i=0;
34 tmp->next=cur->next;
35 cur=cur->next;//tmp=cur;
36 // count++;if(count==ALL-1)break;
37 if(cur->next==cur)break;
38 }else{
39 tmp=cur;
40 cur=cur->next;
41 }
42 printf("\n");
43
44 }
45 printf("\n\nThe last one's Number is:%d\n",cur->Number);
46 }
其实我一直想用数组做的,觉得可以,构思了很久才想出来怎么做(好多循环啊,会把你饶迷的):
View Code
1 int main(){
2 int ALL=10;
3 int out=3;
4 #define is_here 1
5 #define is_out 0
6 int head[ALL][3];
7 int i=0,j=0;
8 for(;i<ALL;i++){
9 head[i][0]=i+1;
10 head[i][1]=is_here;
11 head[i][2]=++j;
12 if(j==3)j=0;
13 }
14 int isover=1;int isLastFlag=0;
15 i=0;int is_here_num=ALL;int count=0;int last;
16
17 while(isover){
18 for(i=0;i<ALL;i++){
19 if(head[i][1]==is_here) printf("%d %s %d \n",head[i][0],head[i][1]==is_here?"is_here":"is_out",head[i][2]);
20 if(head[i][2]==out && head[i][1]==is_here){
21 head[i][1]=is_out;
22 printf("I am %d, and i am out\n",head[i][0]);
23 count++;
24 if(count==ALL-1){//只剩下一个的时候
25 isover=0;i=ALL;break;
26 // j=0;isLastFlag=0;
27 }
28 }
29 }
30
31
32 isLastFlag=0;//j=0;
33 for(i=0;i<ALL;i++){//reset 1 2 3;
34 if(head[i][1]==is_here){
35 head[i][2]=++j;
36 if(j==out){
37 j=0;
38 isLastFlag=1;
39 }
40 }
41 }
42 if(isLastFlag==0){//if 剩余的小于 这个 out数字.继续循环直到j=out的时候
43 isLastFlag=2;
44 last=1;
45 while(last){
46 for(i=0;i<ALL;i++){
47 if(head[i][1]==is_here){
48 head[i][2]=++j;
49 }
50 if(j==out){
51 i=ALL;last=0;
52 }
53 }
54 }
55 }
56
57 }
58 for(i=0;i<ALL;i++){
59 if(head[i][1]==is_here)
60 printf("The Last One is :%d\n",head[i][0]);
61 }
62
63 }
把赋值初始化 单独拿出来:
View Code
1 int ALL=10;
2 int out=3;
3 int head[10][3];
4 //int head[ALL][3];//this is error? variable modified 'head' at file scope
5 #define is_here 1
6 #define is_out 0
7 int i=0,j=0;
8
9 int isover=1;
10 int isLastFlag=0;//标志
11 int count=0;
12 int last;
13
14 void initarray(int level){
15 for(i=0;i<ALL;i++){
16 if(level==0){
17 head[i][0]=i+1;
18 head[i][1]=is_here;
19 head[i][2]=++j;
20 if(j==out){
21 j=0;
22 isLastFlag=1;
23 }
24 }else{
25 if(head[i][1]==is_here){
26 head[i][2]=++j;
27 if(level==2){
28 i=ALL;last=0;
29 }else{
30 if(j==out){
31 j=0;
32 isLastFlag=1;
33 }
34 }
35 }
36 }
37 }
38 }
39
40 int main(){
41 int is_here_num=ALL;
42 initarray(0);
43 while(isover){
44 for(i=0;i<ALL;i++){
45 if(head[i][1]==is_here) printf("%d %s %d \n",head[i][0],head[i][1]==is_here?"is_here":"is_out",head[i][2]);
46 if(head[i][2]==out && head[i][1]==is_here){
47 head[i][1]=is_out;
48 printf("I am %d, and i am out\n",head[i][0]);
49 count++;
50 if(count==ALL-1){//只剩下一个的时候
51 isover=0;i=ALL;break;
52 }
53 }
54 }
55
56 isLastFlag=0;
57 initarray(1);
58
59 if(isLastFlag==0){//if 剩余的小于 这个 out数字.继续循环直到j=out的时候
60 isLastFlag=2;
61 last=1;
62 while(last){
63 initarray(2);
64 }
65 }
66
67 }
68 for(i=0;i<ALL;i++){
69 if(head[i][1]==is_here)
70 printf("The Last One is :%d\n",head[i][0]);
71 }
72
73 }
这个遇到的问题就是 如果是函数传递 二维数组的参数,有错误,比如int initarray(int **array,int level);传入参数写成了initarray(&&head,0);有错误。。其实这个head动态分配malloc,直接用**来做 或许还好点吧。。