学生排队
问题描述
分析
原理还是比较简单的,但是第二题一如既往的延续它的麻烦,稍有不慎就绕进去了,我就绕了小半天。
利用 l[100] 数组来模拟队列的位置,pos[1001]来记录学生的位置。可一边输入p,q,一边调整队列,节省空间。按照p>0或p<0分支,执行向后移动和向前移动。
难点是对调整后每个学生所在位置的记录,对于我来说,乱的要命。
源代码
#include <iostream>
#include <cstdio>
using namespace std;
int l[1005];
int pos[1005];
int main()
{
int n,m;
cin>>n;
cin>>m;
for(int i=1;i<=n;i++)
{
l[i]=i;//记录位置i的学生的学号
pos[i]=i;//记录学号i的学生所在位置
}
while(m--)
{
int p,q;
cin>>p>>q;
if(q>0) //向后移动
{
int x = pos[p];
//cout<<p<<"的位置:"<<x<<endl;
int temp = l[x];
for(int i=x;i<=x+q;i++) //整体后移
{
l[i] = l[i+1];
}
l[x+q] = temp;
for(int i=x;i<=x+q;i++) //记录位置
{
pos[l[i]] = i;
//cout<<l[i]<<"的位置:"<<i<<endl;
}
//pos[p] = x+q;
//cout<<p<<"的位置:"<<pos[p]<<endl;
// for(int i=1;i<=n;i++)
// {
// cout<<l[i]<<' ';
// }
// cout<<endl;
}
else{ //向前移动
int x = pos[p];
//cout<<p<<"的位置:"<<x<<endl;
int temp = l[x];
for(int i=x;i>x+q;i--) //整体前移
{
l[i] = l[i-1];
}
l[x+q] = temp;
for(int i=x;i>x+q;i--) //记录位置
{
pos[l[i]] = i;
//cout<<l[i]<<"的位置:"<<i<<endl;
}
pos[p] = x+q;
//cout<<p<<"的位置:"<<pos[p]<<endl;
// for(int i=1;i<=n;i++)
// {
// cout<<l[i]<<' ';
// }
// cout<<endl;
}
}
for(int i=1;i<=n;i++)
{
cout<<l[i]<<' ';
}
}
问题与分析
刚开始运行总是出现输出队列的次序不对,而且是前两次调整没问题,最后一次就出错了。
将代码分析了好长时间,加了一大堆测试语句,后来终于找到了BUG所在。
改完之后就对了,还是满分呢。