题目
输入样例:
00100 6
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
输出样例:
68237 6 00100
00100 1 99999
99999 5 12309
12309 2 00000
00000 4 33218
33218 3 -1
思路:这是个类似链表的一个结构,用结构体存储数据,地址作为下标存到node[100005]里,再通过头结点地址往下找出下一个的地址,按顺序把地址存放到p1[],最后重排每个数据的地址存放到p2[]
第一次的代码,由于没考虑可能存在无关的结点,p1始终会存放n个地址,测试点4没过
//可能存在无关结点,数据可能不到n个
for(i=0;i<n;i++){
p1[k1++] = head;
head = node[head].next;
}
测试数据:
00100 7
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
24444 233 99999
更换了用下一个地址为-1作为结束
while(head!=-1){
p1[k++] = head;
head = node[head].next;
}
AC代码:
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
struct Node{
int data;
int next;
};
int main(int argc, char *argv[]) {
int head,n,p1[100005],p2[100005],i;
struct Node node[100005];
scanf("%d%d",&head,&n);
int arrd,data,next;
for(i=0;i<n;i++){
scanf("%d%d%d",&arrd,&data,&next);
node[arrd].data = data;
node[arrd].next = next;
}
int k,k1,k2;
k = k1 = k2 = 0;
//可能存在无关结点,数据可能不到n个
/*
for(i=0;i<n;i++){
p1[k1++] = head;
head = node[head].next;
}*/
while(head!=-1){
p1[k++] = head;
head = node[head].next;
}
k1 = 0;
k2 = k-1;
int t = 0;
while(k1<=k2){
if(k1==k2){
p2[t++] = p1[k2--];
break;
}
p2[t++] = p1[k2--];
p2[t++] = p1[k1++];
}
for(i=0;i<t-1;i++){
printf("%05d %d %05d\n",p2[i],node[p2[i]].data,p2[i+1]);
}
printf("%05d %d -1\n",p2[i],node[p2[i]].data);
return 0;
}