MaratonIME eats japanese food
题目链接:Gym - 101375C
呃,wa多遍的教训告诉我们,做流程题的时候一定要 及时写下思路 再敲,要不然半路就会丢三落四少很多东西。。
这次不贴ac代码,分析一下这个错题的错误点和不好的地方。
#include <stdio.h>
struct node
{
int x,y,r;
} a[1003];//首先,数组开小了,5000个数,1000是数字范围
int main()
{
int n,i,cont=0,o,d2,q,w,e,f,j;
char cz[3];
scanf("%d",&n);
for(i=1; i<=n; i++)
{
//看到后面就会发现这个循环很蹩脚,即使不存i仍然+1,导致a[i]里没数,后来遍历的时候就尴尬了。
scanf("%s %d %d %d",cz,&q,&w,&e);//也可以用getchar,%c的组合
if(i==1&&cz[0]=='A')
{
a[i].x=q,a[i].y=w,a[i].r=e;//代码虽然短,但分行写真的更清楚
cont++;
printf("Ok\n");
}
else if(i==1)//没有注意table只有100cm,须判断如若>100则无论ad都输出no
printf("No\n");
else if(cz[0]=='A')
{
for(j=1,f=1; j<=cont; j++)//标记变量太多导致层次不清晰,直接用j状态判断即可
{
if(a[j].x==q&&a[j].y==w&&a[j].r!=0)
{
f=0;
printf("No\n");
break;
}
else
{
d2=(a[j].x-q)*(a[j].x-q)+(a[j].y-w)*(a[j].y-w);
if(d2<(a[j].r+e)*(a[j].r+e))
{
f=0;
printf("No\n");
break;
}
}
}
if(f)
{
a[i].x=q,a[i].y=w,a[i].r=e;
cont++;
printf("Ok\n");
}
}
else if(cz[0]=='R')
{
o=1;
for(j=1,f=1; j<=cont; j++)
if(a[j].x==q&&a[j].y==w&&a[j].r==e)
{
a[j].x=a[j].y=a[j].r=0;
//这里本是为缩短时间而设计,但如果取出次数太多,后来遍历的时候的次数将越来越大,反而弄巧成拙
//不妨两种都试一下,若取出次数少,就用将数组前推的方式删除元素
o=0;
printf("Ok\n");
cont++;//应该是cont--
break;
}
if(o)printf("No\n");
}
}
return 0;
}
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
真的找不到哪错了卡了几个小时,judge只过了两组数据,Orz 不做了,教训不找了找不到了。de不出的bug,就整理思路重写吧
溜了~