回 帖 发 新 帖 刷新版面

主题:大虾帮忙...

Problem  
  ...统计平行线段总数

Input Format:
  直线数,条件数..
  虽然平行符号可以很容易的type出(//)
  但是垂直符号就不好办了呀- -..
  所以么...用字母p表平行...v表垂直..  
  直线用字母l加数字什么的表示..
Sample Input:
6 5
l1 p l2
l2 v l4
l2 p l3
l4 p l5
l4 v l6
 
Sample Output:
7

Ps:样例是这样...
(l1 // l2 , l1 // l6 , l2 // l6
 l1 // l3 , l2 // l3 , l3 // l6
 l4 // l5)

回复列表 (共2个回复)

沙发

对了,忘了说,要PASCAL的...

板凳

你这里应该是平面几何吧,要是立体几何这题就麻烦多了。
(我是按平面几何做的)
算法不是太好,太大的数据会出问题。
  var
    l:array [1..100] of shortint;
    g:array [1..100,1..100] of shortint;
    m,n:word;
    i,j,c:word;
    s:string;
    p,q:word;
    t:longint;
    pv:shortint;
    code:integer;
begin
  readln(m,n);
  fillchar(l,m,0);
  for i:=1 to n do begin
    readln(s);
    delete(s,1,1);
    val(copy(s,1,pos(' ',s)-1),p,code);
    if s[pos(' ',s)+1]='p' then pv:=1
                           else pv:=-1;
    s:=copy(s,pos(' ',s)+4,length(s)
       -(pos(' ',s)+4)+1);
    val(s,q,code);
    g[p,q]:=pv; g[q,p]:=pv;
  end;
  p:=0;q:=0;
  l[1]:=1;
  repeat
    c:=0;
    for i:=1 to m do if l[i]<>0 then
     for j:=1 to m do if l[j]=0 then
      if g[i,j]<>0 then begin
        l[j]:=l[i]*g[i,j]; c:=1;
      end;
  until c=0;
  p:=0; q:=0;
  for i:=1 to m do if l[i]=1 then inc(p)
                             else inc(q);
  writeln((p*(p-1)+q*(q-1)) div 2);
end.

我来回复

您尚未登录,请登录后再回复。点此登录或注册