需要设计一个顺序循环队列,长度len为10,队列中有n个元素(1≤n<10)。选择任意一个元素为蛇的头部,队尾元素为蛇的尾部。贪吃蛇开始移动吃他前面的元素,并追加至蛇的尾部,使蛇变长。
第1行,第1个数为一串整形数字,第2个元素表示队头元素的下标值。
第2行,第1个数表示蛇头部的元素,第2个数表示蛇头部元素的下标值。
输入样例
123456789 0
3 2
输出样例
134567892
3 1
345678921
3 0
本人学艺不精,只会队列的入队出队,请问如何在该代码的基础上将其修改为符合题目的需求
#include<stdio.h>
#include<stdlib.h>
struct queue{
int Data[100];
int Rear;
int Front;
};
void Createqueue(struct queue *q)
{
q->Rear = -1;
q->Front = -1;
}
void Addqueue(struct queue *q, int x)
{
q->Rear++;
q->Data[q->Rear] = x;
}
int Outqueue(struct queue *q)
{
q->Front++;
return q->Data[q->Front];
}
int Isqueue(struct queue *q)
{
int i;
if(q->Rear == q->Front) {
i = 0;
}
else {
i = 1;
}
return i;
}
int main()
{
struct queue Qa;
Createqueue(&Qa);
int i;
for(i = 0;i<9;i++)
{
Addqueue(&Qa,i);
}
while(Isqueue(&Qa))
{
int k = Outqueue(&Qa);
printf("%d",k);
}
}
代码如下:
#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;
}