代码如下:
#include <stdio.h>
#define LEN 10
struct queue {
int Data[LEN];
int Rear;
int Front;
};
void InitQueue(struct queue* q)
{
for(int i=0;i<LEN;i++)
q->Data[i] = -1;
}
//输出
void show(struct queue* q,int head)
{
int i,j;
for(i=head,j=0;j<LEN;i++,j++)
{
if(q->Data[i%LEN] != -1)
printf("%d",q->Data[i%LEN]);
}
printf("\n");
}
int main()
{
char str[12] = { 0 };
int qhead; //对头位置
int sn, snindex; //蛇头元素和蛇头下标
int i, v, size = 0;
struct queue Qa;
InitQueue(&Qa); //初始化队列
scanf("%s %d", str, &qhead);
scanf("%d %d", &sn, &snindex);
Qa.Front = qhead; //队头
//将数字串放入队列
for (i = 0; str[i] != '\0'; i++)
Qa.Data[(qhead+i)%LEN] = str[i]-'0'; //循环排放
//如果队头下标==蛇头下标,直接输出即可
if (qhead == snindex)
{
show(&Qa,qhead);
printf("%d %d\n", sn, snindex);
return 0;
}
else
{
//如果队头==0
if (qhead == 0)
{
//队尾肯定在最后,所以蛇头直接向前移动即可
while (snindex > qhead)
{
//队列数据前移
v = Qa.Data[snindex - 1];
for (i = snindex; i < LEN; i++)
Qa.Data[i - 1] = Qa.Data[i];
Qa.Data[LEN - 1] = v;
snindex--;
//输出蛇元素
show(&Qa,qhead);
printf("%d %d\n", sn, snindex);
}
}
else
{
// 对头下标不为0,队尾肯定在头的左侧
Qa.Rear = Qa.Front - 1;
//如果蛇头初始位置在队尾的左侧
if (snindex <= Qa.Rear)
{
//先向左侧
while (snindex > 0)
{
v = Qa.Data[snindex - 1];
for (i = snindex; i <= Qa.Rear; i++)
Qa.Data[i - 1] = Qa.Data[i];
Qa.Data[Qa.Rear] = v;
snindex--;
//打印
show(&Qa,qhead);
printf("%d %d\n", sn, snindex);
}
//snindex == 0
v = Qa.Data[LEN-1]; //
Qa.Data[LEN-1]= Qa.Data[0];
for(i=0;i<Qa.Rear;i++)
Qa.Data[i] = Qa.Data[i+1];
Qa.Data[Qa.Rear] = v;
snindex = LEN - 1;
show(&Qa,qhead);
printf("%d %d\n",sn,snindex);
//左侧吃完后,绕到数组末尾开始
while (snindex > qhead)
{
v = Qa.Data[snindex - 1];
//蛇头后半部分移动
for (i = snindex; i < LEN; i++)
Qa.Data[i - 1] = Qa.Data[i];
Qa.Data[LEN - 1] = Qa.Data[0];
for (i = 0; i < Qa.Rear; i++)
Qa.Data[i] = Qa.Data[i + 1];
Qa.Data[Qa.Rear] = v;
snindex--;
if (v == -1)
continue;
show(&Qa,qhead);
printf("%d %d\n", sn, snindex);
}
}
else
{
//蛇头在队尾的右侧
//size = LEN - (snindex - qhead); //初始蛇身长度(含-1)
while (snindex > qhead)
{
v = Qa.Data[snindex - 1];
//蛇头后半部分移动
for (i = snindex; i < LEN; i++)
Qa.Data[i - 1] = Qa.Data[i];
Qa.Data[LEN - 1] = Qa.Data[0];
for (i = 0; i < Qa.Rear; i++)
Qa.Data[i] = Qa.Data[i + 1];
Qa.Data[Qa.Rear] = v;
snindex--;
show(&Qa,qhead);
printf("%d %d\n", sn, snindex);
}
}
}
}
return 0;
}