题目链接:
解题思路:
暴力,首先根据题目要求将所有给出节点按字典序(从小到大)排列
循环S(节点总数)次,每次通过遍历数组找到一个未出现过的,且满足条件:只能出现在现有位置上(本可出现在之前位置,但被其他节点占据)的节点
输出节点的值 并标记为出现过即可得到答案
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define M 1005
using namespace std;
struct node
{
int d;
int pos;
int value;
int used;
} Node[M];
int vis[M];
int n;
int cmp(node a,node b)
{
return a.value<b.value;
}
int OK(int loc)
{
int mod=Node[loc].value%n;
if(Node[loc].d==0&&vis[mod]==0)
{
vis[mod]=1;
return 1;
}
else
{
for(int i=mod; i!=Node[loc].pos; i=(i+1)%n)
{
if(!vis[i])
return 0;
}
vis[Node[loc].pos]=1;
return 1;
}
}
int main()
{
int s;
scanf("%d",&n);
s=0;
int a,mod;
for(int i=0; i<n; i++)
{
vis[i]=0;
scanf("%d",&a);
if(a!=-1)
{
mod=a%n;
if(mod<i)
Node[s].d=i-mod;
else //注意mod>i的情况
Node[s].d=i+n-mod;
Node[s].pos=i;
Node[s].used=0;
Node[s++].value=a;
}
}
sort(Node,Node+s,cmp);
for(int i=0; i<s; i++)
{
for(int j=0; j<s; j++)
if(!Node[j].used&&OK(j))
{
Node[j].used=1;
if(i==0)
cout<<Node[j].value;
else
cout<<' '<<Node[j].value;
break;
}
}
cout<<endl;
return 0;
}