多边形填充问题(一个ZOL问题)

dawnhorizon 2003-05-22 04:49:23
大意是多边形由三角组成:
____________
_\/_\/_\/_\/_______________
_/\_/\
(就是这个意思吧,具体图可见:
http://acm.zju.edu.cn/show_problem.php?pid=1606)
任何这样的多边形可以由A,B,C三种形式的菱形组成,每个菱形由2三角型组成,
(上述网页中的A,B,C类型菱形),
按照6个方向给出边以及每边的三角形边数,要求给出A,B,C的个数.
我想用切割法,发现比较麻烦,有什么简单方法吗?
...全文
25 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
kbsoft 2003-05-22
  • 打赏
  • 举报
回复
More detailed please refer to
http://members.lycos.co.uk/kbsoft/wdb/wdbread.php?forumid=1&filename=f_58
kbsoft 2003-05-22
  • 打赏
  • 举报
回复
program Rho;
const
{ constraint on number of polygon sides }
MAX = 50000;

type
{ answer }
Answer = record
a :Longint;
b :Longint;
c :Longint;
end;

{ polygon side }
Element = record
dir :Byte;
cnt :Longint;
end;

{ vertex }
Point = record
x :Double;
y :Double;
end;

{ edge }
Side = record
p :Point;
q :Point;
end;

{ polygon }
Elements = array[1..MAX] of Element;

{ border }
Sides = array[1..MAX] of Side;

{ for calculating area }
Vector = array[1..6, 1..2] of Longint;

const
{ for calculating number of rhombs of type A (without [1, 4]) }
VEC_A : Vector = (( 0, 0), ( 1, 0), ( 0,-1), ( 0, 0), (-1, 0), ( 0, 1));

{ for calculating number of rhombs of type B (without [3, 6]) }
VEC_B : Vector = (( 1, 0), ( 0,-1), ( 0, 0), (-1, 0), ( 0, 1), ( 0, 0));

{ for calculating number of rhombs of type C (without [2, 5]) }
VEC_C : Vector = (( 1, 0), ( 0, 0), ( 0,-1), (-1, 0), ( 0, 0), ( 0, 1));

{ cast to space of points with respect to v }
procedure Cast(v :Vector; var a :Elements; c :Longint; var b :Sides);
var i :Longint; p, q :Point;
begin
if (c > 1) then begin
q.x := 0;
q.y := 0;
for i := 1 to c do begin
p.x := q.x;
p.y := q.y;
q.x := p.x + a[i].Cnt*v[a[i].Dir, 1];
q.y := p.y + a[i].Cnt*v[a[i].Dir, 2];
b[i].p := p;
b[i].q := q;
end;
end;
end;

{ simple algoritm to calculate area of polygon }
function CalculateArea(var b :Sides; c :Longint) :Double;
var i :Longint; rs :Double;
begin
rs := 0;
if (c > 1) then
for i := 1 to c-1 do
rs := rs + (b[i].p.x*b[i].q.y - b[i].p.y*b[i].q.x);
CalculateArea := abs(rs)/2;
end;

{ read polygon elements from input file into array }
procedure ReadInput(var a :Elements; var c :Longint);
var i, j, k :Longint;
begin
Readln(c);
if (c > 0) then
for i := 1 to c do begin
Readln(j, k);
a[i].Dir := j;
a[i].Cnt := k;
end;
end;

{ polygon can be divided into respective number of rhombs }
procedure WriteAnswer(a :Answer);
begin
Writeln(a.a, ' ', a.b, ' ', a.c);
end;

var
len :Longint;
inp :Elements;

pts :Sides;

anw :Answer;

begin
// read input file
ReadInput(inp, len);

// count rhombs of type A
Cast(VEC_A, inp, len, pts);

anw.a := Round(CalculateArea(pts, len));

// count rhombs of type B
Cast(VEC_B, inp, len, pts);

anw.b := Round(CalculateArea(pts, len));

// count rhombs of type C
Cast(VEC_C, inp, len, pts);

anw.c := Round(CalculateArea(pts, len));

// output answer
WriteAnswer(anw);
end.

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧