zoukankan      html  css  js  c++  java
  • C语言算法碎碎记录之“一圈人,数到几的人就出去,最后一个是几号”

    一队列有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,直接用**来做 或许还好点吧。。
     

    转载请注明出处:http://www.cnblogs.com/ayanmw 多谢

    ------------------------------------------------------------------------------------------------

    一定要专业!本博客定位于 ,C语言,C++语言,Java语言,Android开发和少量的Web开发,之前是做Web开发的,其实就是ASP维护,发现EasyASP这个好框架,对前端后端数据库 都很感觉亲切啊。. linux,总之后台开发多一点。以后也愿意学习 cocos2d-x 游戏客户端的开发。

  • 相关阅读:
    HDU2586 How far away?(tarjan的LCA)
    You Raise Me Up
    POJ2891 Strange Way to Express Integers(中国剩余定理)
    POJ2142 The Balance(扩展欧几里得)
    HDU 1166模仿大牛写的线段树
    NetWord Dinic
    HDU 1754 线段树裸题
    hdu1394 Minimum Inversion Number
    hdu2795 Billboard
    【完全版】线段树
  • 原文地址:https://www.cnblogs.com/ayanmw/p/2386576.html
Copyright © 2011-2022 走看看