小D正在玩CS,喜欢思考的他看到无数子弹从他眼前飞过时想到了一个奇怪的问题:这么多子弹在空中飞来飞去,难道它们不会相撞吗?当然这是可能的.小D把两颗子弹轨迹相交的地方叫做”火力汇点”,显然如果让敌人站在火力汇点上那么他将受到更严重的伤害.小D想知道平面上的所有火力汇点以便对敌人造成更重的打击,但是小D数学很差,所以他找到了你,请你帮他计算出平面上所有火力汇点的坐标.小D用直线来描述子弹的轨迹,这种子弹很特别,它发射后会迸裂成两颗并沿相反方向飞行(汗!!那不是打自己),小D数学很差(已知),只会用直线的一般式表示每条直线y=kx+b. [数据规模] 对所有数据k,b<=maxint n<=100
input: n k1 b1 k2 b2 . kn bn 第一行一个数n,表示直线数量 接下来n行,每行描述一条直线
output: 最多的火力交点数目 没有输出 No Fire Point.
【参考程序】:
const wc=1e-10; var p:array[0..5000,1..2] of real; line:array[1..100,1..2] of integer; i,j,n:integer; procedure put(x,y:real); var i:integer;f:boolean; begin f:=true; for i:=1 to trunc(p[0,1]) do if (abs(p[i,1]-x)<wc) and (abs(p[i,2]-y)<wc) then f:=false; if f then begin p[0,1]:=p[0,1]+1; p[trunc(p[0,1]),1]:=x; p[trunc(p[0,1]),2]:=y; end; end; procedure work(i,j:integer); var x,y:real; begin if (line[i,1]-line[j,1])<>0 then begin x:=(line[j,2]-line[i,2])/(line[i,1]-line[j,1]); y:=line[i,1]*x+line[i,2]; put(x,y); end; end; begin while not eof do begin readln(n); p[0,1]:=0.0; for i:=1 to n do readln(line[i,1],line[i,2]); for i:=1 to n do for j:=i+1 to n do work(i,j); n:=trunc(p[0,1]); if n>0 then writeln(n) else writeln('No Fire Point.'); end; end.
|