Description | ||||||
冰墩墩和冰壶题目描述冰壶是被誉为“冰面上的国际象棋”,其计分规则是各自投壶,最后在大本营内,你有几个壶离圆心比对方所有壶离圆心都近就得到几分。 比如红方有两个壶,分别在坐标(1,1),(−2,1);黄方也有两个壶,分别在(1,0),(0,2)。 由于黄方的第一个壶离圆心更近,而黄方的第二个壶没有红方第一个壶近,所以最后黄方得1分,红方不得分。 现在冰墩墩每次都选择红方,它想知道它到底得了多少分? 输入格式第一行是一个整数T(1≤T≤3000),表示样例的个数。 每个样例的第一行是一个整数n(1≤n≤16),表示冰壶的数量。 以后每行一个冰壶的信息,为三个部分,第一个是一个字符,表示冰壶的颜色(R表示红色,Y表示黄色),后面是两个整数(数值的绝对值不超过1000),表示冰壶的坐标。 输入数据保证不会出现两个壶在同一个坐标。 输出格式依次输出每个样例的结果。结果为一行,分为两个部分,如果没有让对方得分,输出“Win”和分数,否则输出”Lose”和对方得分的分数,两者之间相隔一个空格。 样例输入2 4 Y 1 1 R -2 1 R 1 0 Y 0 2 4 Y 1 1 R 0 1 R 1 0 Y 0 2 样例输出Win 1 Win 2 |
我知道我是真的菜,搞指针一直报错,只能硬来了。。。。。。
#include<stdio.h>
#include<math.h>
int main()
{
int z=0;
int v=0;
double a[10000]={0};
double b[10000]={0};
int sum;
double x,y;
int io,jo,ko;
double max1=1000000000;
double max2=1000000000;
char wino;
char c;
int i,j,k,n,num;
i=0;
scanf("%d",&n);
for(;i<n;i++)
{
max2=1000000000;
max1=1000000000;
scanf("%d",&num);
j=0;
z=0;
v=0;
for(;j<num;j++)
{
getchar();
scanf("%c %lf %lf",&c,&x,&y);
if(c=='R')
{
a[z]=sqrt(x*x+y*y);
z++;
}
if(c=='Y')
{
b[v]=sqrt(x*x+y*y);
v++;
}
}
z--;
v--;
io=0;
for(jo=0;jo<=z;jo++)
{
if(a[jo]<max1)
{
max1=a[jo];
}
}
for(ko=0;ko<=v;ko++)
{
if(b[ko]<max2)
{
max2=b[ko];
}
}
if(max1<=max2)
{
wino='R';
}
else{
wino='Y';
}
io=0;
k=0;
sum=0;
jo=0;
int oo;
if(wino=='R')
{
while(io<=z)
{
k=1;
jo=0;
oo=1;
for(;jo<=v;jo++)
{
if(a[io]>=b[jo])
{
oo=-1;
break;
}
}
if(oo==1)
{
sum++;
}
io++;
}
}
if(wino=='Y')
{
while(jo<=v)
{
k=-1;
oo=1;
io=0;
for(;io<=z;io++)
{
if(a[io]<=b[jo])
{
oo=-1;
break;
}
}
if(oo==1)
{
sum++;
}
jo++;
}
}
if(k>0)
{
printf("Win %d\n",sum);
}
if(k<0)
{
printf("Lose %d\n",sum);
}
io=0;
for(;io<=(v+3);io++)
{
a[io]=b[io]=0;
}
}
return 0;
}