1. Trang chủ
  2. » Kinh Doanh - Tiếp Thị

Chu de 16 2015

33 6 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 33
Dung lượng 28,84 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

6 điểm ĐƯỜNG THẲNG CHỨA 3 ĐIỂM Cho một dãy gồm N điểm khác nhau N 0 thì ghi ra SL bộ số để trong cặp ngoặc vuông, mỗi bộ số đó là chỉ số của các điểm nằm trên đường thẳng tương ứng.. 7 [r]

Trang 1

1 Đường thẳng chứa

Bài 1 (6 điểm) ĐƯỜNG THẲNG CHỨA 3 ĐIỂM

Cho một dãy gồm N điểm khác nhau (N <= 200)

Yêu cầu: Tìm xem có bao nhiêu đường thẳng khác nhau, mỗi đường thẳng đó chứa ít nhất 3 điểm trong N điểm nói

trên

Dữ liệu: Đọc vào từ tệp DT3D.INP, gồm nhiều phương án, mỗi phương án trên một dòng, trên dòng đó ghi N cặp

số X, Y là tọa độ của N điểm

Kết quả: Ghi ra màn hình và ghi ra tệp DT3D.OUT, mỗi phương án trên một dòng, trên dòng đó ghi số lượng (SL)

các đường thẳng tìm được (nếu không tìm được đường thẳng nào thỏa mãn thì đặt SL = 0), tiếp đó, nếu SL > 0 thìghi ra SL bộ số để trong cặp ngoặc vuông, mỗi bộ số đó là chỉ số của các điểm nằm trên đường thẳng tương ứng

Bài 2 (7 điểm) ĐIỂM TRONG ĐA GIÁC

Cho đa giác không tự cắt có N đỉnh và một điểm P =(px, py)

Yêu cầu: Txác định vị trí của điểm P đối với đa giác đã cho.

Dữ liệu: Đọc từ tệp DTDG.INP, gồm nhiều phương án, mỗi phương án trên một dòng, trên dòng đó ghi cặp số px,

py, tiếp đó ghi N cặp số, mỗi cặp là tọa độ của 1 đỉnh của đa giác

Kết quả: Ghi ra màn hình và ghi ra tệp DTDG.OUT, mỗi phương án trên một dòng, trên dòng đó ghi vị trí VTP

của điểm P đối với đa giác với quy định sau: VTP = 1: P nằm trong đa giác, VTP = -1: P nằm ngoài đa giác, VTP =0: P là 1 đỉnh của đa giác hoặc P nằm trên cạnh của đa giác

Bài 3 (7 điểm) DIỆN TÍCH PHỦ SÓNG

Một công ty kinh doanh dịch vụ điện thoại di động, lắp đặt N ăng ten thu phát sóng trên mặt đất Ăng ten thứ i lắtđặt tại vị trí (X[i], Y[i]), có công suất là R[i] và có diện tích phủ sóng là hình vuông với tâm là (X[i], Y[i]) và diệntích là 4R[i]2

Yêu cầu: Tính tổng diện tích phủ sóng của N ăng ten đó.

Dữ liệu: Đọc từ tệp văn bản PSONG.INP, gồm nhiều phương án, mỗi phương án ghi trên một dòng, trên dòng đó

ghi N bộ ba số X[i], Y[i], R[i], tương ứng với vị trí và công suất của các ăng ten Các số đều là số thực

Kết quả: Ghi ra màn hình và ghi ra tệp văn bản PSONG.OUT, mỗi phương án trên 1 dòng, trên dòng đó ghi tổng

diện tích phủ sóng tìm được, với 2 chữ số thập phân

TÓM TẮT LÝ THUYẾT

Trang 2

1 Điểm, đường thẳng, đoạn thẳng, đa giác

Điểm là đối tượng hình học cơ sở, được biểu diễn bằng một cặp số (x, y)

Trong Pascal, có thể khai báo điểm là cặp số thông thường, cũng có thể dùng bản ghi để khai báo các điểm:

Type Point = record x,y: integer End;

var P, Q, M: Point;

Qua hai điểm khác nhau luôn có một và chỉ một đường thẳng.

Phương trình của đường thẳng đi qua hai điểm P(px,py) và Q(qx,qy) là:

dy*(x-px) = dx*(y-py) trong đó dx = qx – px, dy = qy – py

(Tỷ số dy/dx chính là tang của góc tạo bởi đường thẳng PQ và trục hoành) Trong Pascal, có thể khai báo đường thẳng cặp điểm thông thường, cũng có thể dùng bản ghi để khai báo các đường thẳng:

Type Line = record P1, P2: Point End;

var L1, L2: Line;

Đoạn thẳng được biểu diễn bởi một cặp điểm (P,Q), là phần của đường thẳng đi

qua hai điểm đó, và chỉ gồm các điểm M nằm giữa hai điểm đó Điều kiện cần

và đủ để điểm M là một điểm thuộc đoạn PQ là tồn tại số thực α với 0 <= α <=1

để cho Mx = (1- α) * Px + α * Qx và My = (1- α) * Py + α * Qy

Trong Pascal, không có cách khai báo đoạn thẳng nào khác với cách khai báo đường thẳng nói trên

Đa giác được biểu diễn bởi một danh sách N điểm, trong đó hai điểm kế tiếp

được nối với nhau bởi một đoạn thẳng (điểm cuối có điểm kế tiếp là điểm đầu).Trong Pascal, có thể khai báo đa giác theo nhiều cách khác nhau:

a) Sử dụng hai mảng X, Y riêng biệt:

var X, Y: array[1 NMax] of integer; {các mảng chứa NMax tọa độ}

Cách này thường dùng khi cần xử lý các tọa độ riêng biệt

b) Sử dụng một mảng hai chiều:

var P: array[1 Nmax, 1 2] of integer; {mảng chứa NMax điểm}

Theo cách này điểm thứ I sẽ có tọa độ là Px = P[i,1] và Py = P[I,2]

c) Sử dụng một mảng các bản ghi:

Type Diem = record x,y: integer End;

var P: array[1 Nmax] of Diem; {mảng chứa NMax điểm}

Theo cách này điểm thứ i sẽ có tọa độ là Px = P[i].x và Py = P[i].y

2 Giao của các đoạn thẳng

Để xác định xem hai đoạn thẳng có giao nhau (có điểm chung) hay không, người

ta thường sử dụng hàm CCW sau đây để xác định hướng đi từ điểm (x1,y1) đến

điểm (x2,y2) rồi đến điểm (x3,y3):

function CCW(x1,y1,x2,y2,x3,y3: integer): integer;

Var dx1, dy1, dx2, dy2: integer;

if dx1*dy2 > dy1*dx2 then ccw := 1; {ngược chiều kim đồng hồ}

if dx1*dy2 < dy1*dx2 then ccw := -1; {thuận chiều kim đồng hồ}

if dx1*dy2 = dy1*dx2 then ccw := 0; {ba điểm thẳng hàng}

END;

Từ đó, sự giao nhau của hai đoạn thẳng (x1,y1)-(x2,y2) và (x3,y3)-(x4,y4) được

xác định bởi hàm GiaoNhau như sau:

function GiaoNhau(x1,y1,x2,y2,x3,y3,x4,y4: integer): boolean;

Trang 3

3 Điểm nằm trong đa giác

Để xác định vị trí của điểm P đối với đa giác GD ta có thể làm như sau:

1) Nếu P là đỉnh hoặc P nằm trên cạnh của đa giác thì đặt vtP = 0.

2) Trái lại, tìm điểm M nằm ngoài đa giác sao cho đường thẳng MP

không chứa đỉnh của đa giác Tìm số điểm sc mà đoạn thẳng MP cắt

các cạnh của đa giác (sử dụng hàm CCW nói trên)

Nếu sc lẻ vtP = 1 (P nằm trong đa giác),

trái lại đặt vtP = -1 (P nằm ngoài đa giác).

GIỢI Ý CÁCH GIẢI

Bài 1

- Thủ tục TimSL để tìm số đường thẳng:

Đặt SL = 0, n1 = N – 1, n2 = N - 2

Khởi tạo mảng CD bằng 0 (0: chưa dùng, 1: đã dùng)

Duyệt với i từ 1 đến n2 {Điem thu 1}

Trang 4

if dx*(D[kk,2] - D[ii,2]) = dy*(D[kk,1] - D[ii,1])

thì TH = true trái lại TH = false

Nếu Cat(i) thì tăng sdc

Nếu sdc mod 2 = 1 thì vtp = 1 trái lại vtp = -1

- Hàm TrungDinh: xác định P trùng với đỉnh của da giác

Nếu (px-X[i])*(Y[i+1] - Y[i]) = (py-Y[i])*(X[i+1] - X[i]) thì

Nếu ((px - X[i])*(px-X[i+1])<=0) và ((py - Y[i])*(py-Y[i+1])<=0) thì Đặt ThuocCanh = true

Nếu mx < X[i] thì mx = X[i]

Nếu my < Y[i] thì my = Y[i]

Tăng mx {Tránh trường hợp M trùng với đỉnh của đa giác}

Thoát khỏi vòng lặp theo i;

Cho đến khi cc = false

- Hàm Cat(ii): xác định đoạn MP cắt cạnh ii của đa giác

Đặt x1 = X[ii], y1 = Y[ii], x2 = X[ii+1], y2 = Y[ii+1]

Trang 5

- Hàm ccw(x1,y1,x2,y2,x3,y3): xác định hướng đi từ 1-2-3

Đặt dx1 = x2 - x1, dx2 = x3 - x2, dy1 = y2 - y1, dy2 = y3 - y2

Nếu dx1*dy2 > dy1*dx2 thì ccw = 1 {ngược chiều kim đồng hồ}

Nếu dx1*dy2 < dy1*dx2 thì ccw := -1 {thuận chiều kim đồng hồ}

Nếu dx1*dy2 = dy1*dx2 thì ccw:=0; {thẳng hàng}

Nếu (xt[i]>xt[j]) thì DoiCho(xt,i,j)

- Thủ tục DoiCho(mm, ii,jj): đổi chỗ các phần tử ii, jj của mảng mm

t = mm[ii], mm[ii] = mm[jj], mm[jj] = t

- Hàm NT(x1,y1,x2,y2,x3,y3,x4,y4): Xác định hcn 3-4 nằm trong hcn 1-2

Nếu (x1<=x3) và (x4<=x2) và (y1<=y3) và (y4<=y2)

thì NT = true trái lại NT = false

DỮ LIỆU ĐỂ KIỂM TRA BÀI 1

Trang 6

DỮ LIỆU ĐỂ KIỂM TRA BÀI 3

Tệp PSONG.INP (Chú ý: dữ liệu kéo dài đến dòng thục vào tiếp theo)

Trang 7

196.00

103.00

54.75

MÃ NGUỒN BÀI 1 (Tệp DT3D.PAS)

{Phan khai bao chung}

D: array[1 Nmax, 1 2] of integer; {Dau vao}

sl: integer; {Dau ra}

DT: array[1 Nmax, 1 2] of byte; {Dau ra}

N: integer; {Bien phu}

CD: array[1 nmax] of 0 1; {Mang phu}

pa, sopa: byte; {QL phuong an}

f: text; {Bien tep}

{Dem so phuong an}

procedure DemSoPA;

BEGIN assign(f,tentep+'.INP'); reset(f);

Trang 8

function TH(ii ,jj, kk: byte): boolean;

var dx, dy: integer;

BEGIN

dx := D[jj,1] - D[ii,1];

dy := D[jj,2] - D[ii,2];

if dx*(D[kk,2] - D[ii,2]) = dy*(D[kk,1] - D[ii,1])

then TH := true else TH := false;

if pa=1 then rewrite(f) else append(f); write(SL);

write(f,SL);

if SL > 0 then for i := 1 to SL do begin

write(' [',DT[i,1],' ',DT[i,2]);

write(f,' [',DT[i,1],' ',DT[i,2]);

Trang 9

GIẢI THÍCH MÃ NGUỒN BÀI 1

1 Chương trình chính Sau khi gọi lệnh DemSoPA, vòng lặp For gọi các lệnh DocPA, TimSL, và GhiKQ

2 Lệnh DemSoPA: đếm số phương án có trong tệp dữ liệu

3 Lệnh DocPA: đọc dữ liệu của phương án thứ pa.

4 Lệnh GhiKQ: ghi kết quả ra màn hình và tệp tin.

5 Lệnh TimSL: Tìm số lượng đường thẳng theo yêu cầu, thuật giải đã nêu ở phần Hướng dẫn cách giải

MÃ NGUỒN BÀI 2 (Tệp DTDG.PAS)

{Phan khai bao chung}

uses crt;

const

tentep = 'DTDG'; {Ten tep}

var

px, py: integer; {Dau vao}

X,Y: Array[1 2000] of integer; {Dau vao}

vtp: -1 1; {Dau ra}

N, mx, my: integer; {Bien phu}

sopa, pa: integer;

f:text;

Trang 23

{P thuoc 1 canh cua da giac}

function ThuocCanh: boolean;

if ((px - X[i])*(px-X[i+1])<=0) and ((py -

Y[i])*(py-Y[i+1])<=0) then {P thuoc canh i}

if mx < X[i] then mx := X[i];

if my < Y[i] then my := Y[i];

Trang 24

{huong giua 3 diem: 1: nguoc, -1: thuan, 0: thang

hang}

function ccw(x1,y1,x2,y2,x3,y3: integer): integer;

var dx1, dx2, dy1, dy2: integer;

if dx1*dy2 > dy1*dx2 then ccw := 1; {nguoc}

if dx1*dy2 < dy1*dx2 then ccw := -1; {thuan}

if dx1*dy2 = dy1*dx2 then ccw:=0; {thang hang}

END;

{Doan thang MP cat canh thu ii}

function Cat(ii: integer): boolean;

var x1, y1, x2, y2, cc1, cc2, cc3, cc4: integer;

for i := 1 to N do if Cat(i) then inc(sdc);

if sdc mod 2 = 1 then vtp := 1 else vtp := -1; end;

END;

{Ghi ket qua ra man hinh va tep tin}

procedure GhiKQ;

BEGIN Assign(f, tentep+'.OUT');

if (pa = 1) then Rewrite(f) else Append(f); writeln(vtp);

GIẢI THÍCH MÃ NGUỒN BÀI 2

1 Chương trình chính Sau khi gọi lệnh DemSoPA, vòng lặp For gọi các lệnh

DocPA, TimVTP, và GhiKQ

2 Lệnh DemSoPA: đếm số phương án có trong tệp dữ liệu

3 Lệnh DocPA: đọc dữ liệu của phương án thứ pa.

4 Lệnh GhiKQ: ghi kết quả ra màn hình và tệp tin.

5 Lệnh TimVTP: Tìm vị trí của điểm P theo yêu cầu, thuật giải đã nêu ở phần

Hướng dẫn cách giải

Trang 25

MÃ NGUỒN BÀI 3 (Tệp PSONG.PAS)

{Phan khai bao chung}

X, Y, R: MangST; {Dau vao}

dt: real; {Dau ra}

Trang 32

{doi cho cac phan tu ii va jj cua mang mm}

procedure DoiCho(var mm: MangST; ii,jj: integer);var t: real;

{tao va sap xep mang xx tang dan}

procedure SXTang(mm: MangST; var xt: MangST);var i, i1, j: integer;

BEGIN

for i := 1 to N do

begin

xt[2*i-1] := mm[i] - R[i];

xt[2*i] := mm[i] + R[i];

Trang 33

GIẢI THÍCH MÃ NGUỒN BÀI 3

1 Chương trình chính Sau khi gọi lệnh DemSoPA, vòng lặp For gọi các lệnh

DocPA, TinhDT, và GhiKQ

2 Lệnh DemSoPA: đếm số phương án có trong tệp dữ liệu

3 Lệnh DocPA: đọc dữ liệu của phương án thứ pa.

4 Lệnh GhiKQ: ghi kết quả ra màn hình và tệp tin.

5 Lệnh TinhDT: CTính tổng diện tích phủ sóng theo yêu cầu, thuật giải đã nêu ở

phần Hướng dẫn cách giải

Ngày đăng: 18/09/2021, 14:05

TỪ KHÓA LIÊN QUAN

w