思路拆解:
1、首先定义一个stunum数组,存放初始及每一次变化后的学生学号,利用for循环二元数组输入指令数据。
2、紧接着遍历寻找指令中的学号与初始队列中学号相同的同学,找到让他出队,然后当p>0时往后移动,在这里我考虑的是每次都和相邻同学换位,一共需要换p次,就可以达到插入的效果,换完一次后j++,(意思是:例如第一次循环是第二名和第三名换,j++之后就是第三名和第四名换)。当p<0时,代码类似,需要j--。
3、当将第一条指令执行完毕后,利用之前博客提到新学会的goto函数,跳出循环,一如既往的好用这个函数!跳到只剩最外层循环的位置,紧接着执行第二条指令,以此遍历。
4、利用for循环简单输出stunum。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,m,arr[1001][3];
int stunum[1001];//表示初始学号数组
int main(){
cin>>n>>m;
int k=1;
for(int i=1;i<=n;i++){
stunum[i]=k;
k++;
}
for(int i=1;i<=m;i++){
for(int j=1;j<=2;j++){
cin>>arr[i][j];//输入指令
}
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(arr[i][1]==stunum[j]){//首先根据学号找到需要出队的学生
for(int k=1;k<=abs(arr[i][2]);k++){//需要相邻交换arr[i][2]次
if(arr[i][2]>0){
int temp=stunum[j];
stunum[j]=stunum[j+1];
stunum[j+1]=temp;
j++;
}
if(arr[i][2]<0){
int temp=stunum[j];
stunum[j]=stunum[j-1];
stunum[j-1]=temp;
j--;
}
}
goto out;//前往标识符,跳出循环
}
}
out:;
}
for(int i=1;i<=n;i++){
cout<<stunum[i]<<" ";
}
}