1. 用数组和循环取数组下标的方法处理,0表示还没有出队,1表示已经出队
2. lock变量用来计数,每到三就让当下元素值为0的数组变为1,lock再变成1
3. 当count计数到n-1时候直接break,不能再算了,否则退出循环时候整个数组都变成1
4. goto语句的使用:不能声明在可变长度的数组之前。“就是说goto语句与“标签”之间的code不允许有可变长数组的声明语句。因为goto是无条件跳转语句,需要在编译时确定地址,如果可变长数组夹在其中,则编译器无法确定地址。” 参考文献为:C语言 GOTO 你不知道的事情_jump into scope of identifier with variably modifi-CSDN博客
最后,注意n=1时候这种特殊情况
#include <stdio.h>
#include<stdlib.h>
int main()
{
int n;
scanf("%d",&n);
int a[n];
for(int i=0;i<n;i++)
a[i]=0;
if(n==1)
{
printf("1");
goto q1;
}
int count=0,i=0,lock=1;
while(1)
{
if(lock==3&&a[i]==0)
{
a[i]=1;
i=(i+1)%n;
lock=1;
count++;
if(count==n-1)
break;
}
else if(lock<3&&a[i]==0)
{
i=(i+1)%n;
lock++;
}
else if(lock<3&&a[i]==1)
{
i=(i+1)%n;
}
else if(lock==3&&a[i]==1)
i=(i+1)%n;
}
for(int j=0;j<n;j++)
if(a[j]!=1)
printf("%d",j+1);
q1:
return 0;
}