您的位置:首页 > 编程语言 > C语言/C++

C语言算法碎碎记录之“一圈人,数到几的人就出去,最后一个是几号”

2012-03-09 09:54 274 查看
一队列有N个人,从第一位开始报数,报到3的人出列,后面的人继续从1开始报数,报到末尾后从头开始,如此反复。请确定最后一位是原队列中的第几个人。N的值为正整数。
看到这道题目,以前做过。现在来复习一下吧:
首先用结构体 和 循环单链表来做,最简单:

View Code

int ALL=10;
int out=3;
int head[10][3];
//int head[ALL][3];//this is error? variable modified 'head' at file scope
#define is_here 1
#define is_out 0
int i=0,j=0;

int isover=1;
int isLastFlag=0;//标志
int count=0;
int last;

void initarray(int level){
for(i=0;i<ALL;i++){
if(level==0){
head[i][0]=i+1;
head[i][1]=is_here;
head[i][2]=++j;
if(j==out){
j=0;
isLastFlag=1;
}
}else{
if(head[i][1]==is_here){
head[i][2]=++j;
if(level==2){
i=ALL;last=0;
}else{
if(j==out){
j=0;
isLastFlag=1;
}
}
}
}
}
}

int main(){
int is_here_num=ALL;
initarray(0);
while(isover){
for(i=0;i<ALL;i++){
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]);
if(head[i][2]==out && head[i][1]==is_here){
head[i][1]=is_out;
printf("I am %d, and i am out\n",head[i][0]);
count++;
if(count==ALL-1){//只剩下一个的时候
isover=0;i=ALL;break;
}
}
}

isLastFlag=0;
initarray(1);

if(isLastFlag==0){//if 剩余的小于 这个 out数字.继续循环直到j=out的时候
isLastFlag=2;
last=1;
while(last){
initarray(2);
}
}

}
for(i=0;i<ALL;i++){
if(head[i][1]==is_here)
printf("The Last One is :%d\n",head[i][0]);
}

}


这个遇到的问题就是 如果是函数传递 二维数组的参数,有错误,比如int initarray(int **array,int level);传入参数写成了initarray(&&head,0);有错误。。其实这个head动态分配malloc,直接用**来做 或许还好点吧。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐