看百度上很多都是结构体处理,我来个数组的吧
思路很简单,题目有说只在偶数为放置,说明没有任何两个球在初始状态相邻
我们假设正数朝右,负数朝左
对于特殊情况:
1.球在0号位置->变成1
2.球在L号位置->变成-1*(L-1)
其他的中间情况,只要判断当前有没有和自己在同一个位置的
如果有和自己同一位置,两个数都取相反数(或者直接swap)。然后分别++
这里要注意,如果两个位置是9 -9,相遇后应该首先变成-9 9然后变成-8 10,都是自加一下就行
有一种情况是在变化的过程中,有可能和之前判断的数相同,所以加一个标记数组,用来判断已经使用过的下标。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<stack>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
int main(){
int n,l,t;
cin>>n>>l>>t;
int a[10001];
for(int i=0;i<n;i++){
cin>>a[i];
}
while(t--){
int v[1001]={0};
for(int i=0;i<n;i++){
if(v[i]) continue;
if(a[i]==0) a[i]=1;
else if(a[i]==l) a[i]=-1*(l-1);
else {
int flag=0;
for(int j=0;j<n;j++){
if(i!=j&&abs(a[i])==abs(a[j])){
v[i]=v[j]=1;
a[i]*=-1;
a[j]*=-1;
a[i]++;
a[j]++;
flag=1;
break;
}
}
if(flag==0) a[i]++;
}
}
}
for(int i=0;i<n;i++)
cout<<abs(a[i])<<" ";
return 0;
}