码农题(1)——椰子

终于打好了第一道码农题,虽然这道题并不是多难,而且也没有那么长,我只用了短短的94行就AC了。相比于另外的,就我所知的素数方阵,就需要两三百行才行,而且一般情况下,除非一次过,几乎是查不出出代码中的错误。而我写的这题椰子,我只需要静态差错就瞅个一会儿就查出代码中的错误了,虽然还是用了两三个小时才C掉。
写一下思路和错误。
先上题
码农题(1)——椰子
当游戏开始时,一个椰子沿着与地面垂直的方向落到地面上指定的位置,如果椰子X落到了地上(因为地平线高度为0,故椰子在地上的高度为1),它会待在那里不动,如果它落在了另一个椰子上,就会出现下面几种情重点内容况:
(1)如果椰子Y的左右两边都已有椰子(下图中用“O”表示),则椰子会停在那里不动。

X
     X
OYO => OYO
(2)如果椰子Y的两边都没有其它的椰子,并且椰子X比椰子Y重,那么椰子X将取代椰子Y的位置,同时椰子Y会滑落到其右侧的位置;但是如果椰子X比椰子Y轻,那么椰子X将直接滑落到Y的左侧。(下图中用“-”表示空位)

X
-Y- => -XY (X比Y重)

X
-Y- => XY- (X比Y轻)
(3)如果椰子Y只有一边有一个其它的椰子,发生的情况如下图所示:

X
-YO => YXO (X比Y重)

X
-YO => XYO (X比Y轻)

X
OY- => OXY (X比Y重)

X
OY- => OYX (X比Y轻)
注意:每当椰子X或Y滑落到一个不同的位置时,它会继续滑落直到待到一个不能再滑落的位置为止。 你的任务是输出每一个椰子最终的位置。

输入格式

输入文件的第一行有一个正整数T(T<=30),表示接下来测试数据的个数。 每一个测试数据由一个整数N(1<=N<=1000)开始,表示要掉落的椰子数量,接下来有N行,每行有两个整数Pi和Wi(1<=Pi,Wi<=1000),Pi表示第i个椰子在水平方向的坐标,Wi表示其重量,任意两个椰子的重量都不相同。

输入格式

对于每一个测试数据,输出N行,每一行有一个坐标(Xi,Yi),表示第i个椰子最终的位置,Xi表示高度,Yi表示其在水平方向上的坐标。请在每两组测试数据结果之间输出一个空行。

样例数据

input

2
2
1 1
1 2
4
1 1
2 2
1 3
1 4
output

1 2
1 1

1 0
1 2
1 1
2 1
注释
纯模拟

数据规模与约定
保证T≤30、1≤N≤1000、1≤Pi,Wi≤1000T≤30、1≤N≤1000、1≤Pi,Wi≤1000
时间限制:1s
空间限制:256MB

这题的题意很明了,没有什么坑,
只需要按照题目的要求,逐一进行判断,情况也不多,只有4种,只需要稍微仔细一点,不犯某些奇怪的错误,应该很快就可以了。
我就犯了些奇怪的错误,就比如说判断条件中if后跟了个if(而不是else if);忘记更新坐标最上面的椰子序号;忘记更新椰子的属性……….
wei代码
#include<bits/stdc++.h>
using namespace std;
inline int read()
{
int sum=0;
char c=getchar();
for(;c>='0'&&c<='9'; c=getchar())
sum=(sum<<3)+(sum<<1)+c-48;
return sum;
}
int t,n;
int p[41];
struct ee
{
int h,x;
int v;
}e[20001];//第i个椰子的属性
int f[312121];//f数组表示x位置上处于最上方的椰子的id
//放大两倍是因为可能出现椰子滑落到0的左边
int len,j;
void dfs(int s,int d)//d为掉下的椰子
{
int a=f[s-1],w=f[s],ee=f[s+1];
if(e[w].h>e[a].h&&e[w].h>e[ee].h)//w两边没有椰子
{
if(e[w].v>e[d].v) {dfs(s-1,d);return;}
else if(e[w].v<e[d].v)
{
f[s]=d;
e[d].x=s;
e[d].h=e[w].h;
dfs(s+1,w);
return;
}
}
else if(e[a].h>=e[w].h&&e[ee].h>=e[w].h)//w两边都有椰子
{
f[s]=d;
e[d].h=e[w].h+1;
e[d].x=s;
return;
}
else if(e[a].h>=e[w].h&&e[ee].h<e[w].h)//左边有椰子
{
if(e[w].v>e[d].v) {dfs(s+1,d);return;}
else if(e[w].v<e[d].v)
{
f[s]=d;
e[d].h=e[w].h;
e[d].x=s;
dfs(s+1,w);
return;
}
}
else if(e[a].h<e[w].h&&e[w].h<=e[ee].h)//右边有椰子
{
if(e[w].v>e[d].v)
{
dfs(s-1,d);
return;
}
else if(e[w].v<e[d].v)
{
f[s]=d;
e[d].x=s;
e[d].h=e[w].h;
dfs(s-1,w);
return;
}
}
}
void Printf()
{
for(int k=1;k<=n;k++)
cout<<e[k].h<<' '<<e[k].x-15000<<endl;
cout<<endl;
}
int main()
{
t=read();
for(int i=1;i<=t;i++)
{
memset(f,0,sizeof(f));
memset(e,0,sizeof(e));
j=1;
n=read();
for(j=1;j<=n;j++)
{
e[j].x=read();
e[j].v=read();
dfs(e[j].x+15000,len+j);
}
Printf();
}
return 0;
}