超时超麻了,最后才想出来如何优化,/(ㄒoㄒ)/~~
这是一道模拟贪吃蛇的题目,题意还是很好理解的,让头先走,再让后面的部分走向其前一位的部分b[i] = b[i-1](b用来存放每一部分的位置)。我一开始只是循环进行龙的移动的,然后就超时了。。。
所以这里用队列的结构来进行优化,将每一次龙头移动后的新位置填入数组的新一位,之后我们对每一部分进行访问时只要通过龙头现在在数组中的下标进而访问每一部分就可以知道了。
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
typedef pair<int,int> PII;
const int N =1e8+10;
int n, q;
int a , a1 ;
char c;
PII b[N];
int main(){
cin>>n>>q;
int l = 1, r = n;
for(int i =1 ; i <= n ; i++ ){
b[i].first = n - i +1;
}
// for(int i = n ; i >= 1 ; i--) cout<<b[i].first<<" ";
while(q--){
scanf("%d",&a);
if(a == 2){
scanf("%d" ,&a1);
printf("%d %d\n" ,b[r - a1 + 1].first , b[r - a1 + 1].second);
}
else{
cin>>c;
l++;
r++;
if(c == 'U'){
b[r].first = b[r-1].first;
b[r].second = b[r-1].second + 1 ;
}
else if(c == 'D'){
b[r].first = b[r-1].first;
b[r].second = b[r- 1].second - 1;
}
else if(c == 'R'){
b[r].second = b[r- 1].second;
b[r].first = b[r-1].first + 1;
}
else if(c == 'L'){
b[r].second = b[r- 1].second;
b[r].first = b[r - 1].first - 1;
}
}
}
return 0;
}