Tải bản đầy đủ (.doc) (16 trang)

Bài toán ông sao Start

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (95.33 KB, 16 trang )

Một ông sao sáng, hai ông sáng sao...
Nguyễn Xuân Huy
Bạn đếm có thạo không?
Chúng ta học đếm từ tấm bé nhưng hình như chưa thật thạo. Nhiều khi chúng ta lúng túng
không biết vận dụng các kỹ thuật đếm vào việc giải các bài toán tin học. Bài này giới thiệu
với bạn đọc một vài kỹ thuật đếm khá phổ biến trong tin học.
Đếm theo phần
Người xưa đếm sao trên trời theo kiểu "Một ông sao sáng, hai ông sángsao...". Đã bao giờ
bạn thử tìm hiểu ý nghĩa của câu hát trên chưa? Xinmách bạn rằng, cho đến tận ngày nay,
các nhà thiên văn vẫn áp dụng, phương pháp đơn giản này để đếm sao đấy. Bản chất của
kỹ thuật này là như sau. Ngườita chia các ngôi sao trên bầu trời theo từng nhóm căn cứ vào
cấp độ sáng củachúng. Các sao sáng nhất gọi là sao cấp 0, sau đó đến các sao cấp 1, cấp
2,...Rồi người ta đếm theo từng nhóm. Dĩ nhiên là bầu trời mênh mông, số lượng saolà vô
hạn, đếm mãi cũng không xuể. Ta đang nói đến việc đếm các ngôi sao nhìnthấy được bằng
mắt thường. Ta thử vận dụng kỹ thuật đếm theo nhóm để giải bàitoán-tin học sau đây.
Bài 1. (Sơn cột, bài thi học sinh giỏiquốc gia, khối B). Trên mảnh đất hình chữ nhật kích
thước m x n ô vuông đơn vị,người ta xây các cột bê tông hình vuông tại các ô. Mỗi cột bao
gồm một số khốilập phương đơn vị chồng lên nhau. Các cột có thể cao thấp khác nhau.
Sau đóngười ta sơn các mặt bê tông nhìn thấy được của các cột. Tính diện tích cầnsơn.
Dữ liệu vào: Ghi trong tệp văn bản COT.INP, dòng đầu tiên là hai giá trị m và n.Tiếp theo
đó là m dòng, mỗi dòng có n số tự nhiên biểu thị chiều cao đo bằng sốlượng khối lập
phương tạo nên cột bê tông tại vị trí đó.
m, n và chiều cao của mỗi cột không quá 100.
Dữ liệu ra: Hiển thị trên màn hình diện tích cần sơn tính theo ô vuông đơn vị.
Thí dụ, với m=3, n=4 và tệp COT.INP có dạng sau:
COT.INP
3 4
1 0 3 1
2 2 0 1
0 0 1 4
Thì sau khi thực hiện chương trình trên màn hình phải xuất hiện giá trị


5 4
Lời giải
Gọi mảnh đất hình chữ nhật là ABCD. Ta đếm từng mặt theo trật tự tuỳ ý, chẳng hạn:
1. Đếm số khối trên hai chiều dài AB và DC.
2. Đếm số khối trên hai chiều rộng AD và BC.
3. Đếm số khối nhìn thấy theo chiều ngang giữa các hàng.
4. Đếm số khối nhìn thấy theo chiều dọc giữa các cột.
5. Đếm số khối trên mặt.
Trong chương trình SONCOT.PAS dưới đây thủ tục DOS sẽ đọc dữ liệu từ tệp COT.INT
vào mảng a. Thủ tục Xem hiển thị giá trị của mảng a trên màn hình. Thủ tục Dem thực
hiện giải thuật 5 bước nói trên.
Chương trình Pascal
(*SONCOT.PAS*)
uses crt;
const fn = 'COT.INP'; MN=100;
var f:text;
a: array[1..MN, 1..MN] of byte;
{chua du lieu doc tu tep}
d: longint; {dien tich can so}
m,n: integer; {chieu dai va rong cua manh dat}
{Doc du lieu tu tep vao mang a}
procedure DocTep;
var i, j: byte;
begin
assign(f,fn);
reset(f);
read(f,m,n);
for i:=1 to m do
for j:=1 to n do read(f,a[i,j]);
close(f);

end;
{Hien thi du lieu tren man hinh de kiem tra}
procedure Xem;
var i,j:integer;
begin
writeln('m= ',m, 'n= ',n);
for i:=1 to m do begin writeln;
for j:=1 to n do write(a[i,j]:4);
end;writeln;
end;
{Dem dien tich can so}
procedure Dem;
var i,j: byte;
begin
d:=0;
{Dem theo 2 chieu dai AB và CD}
for j:=1 to n do d:=d+a[1,j]+a[m,j]
{Dem theo 2 chieu rong AD va BC}
fori:=1 to m do d:=d+a[i,1]+a[i,n]
{Dem so khoi nhin thay theo chieu ngang giua cac hang}
fori:=2 to m do
for j:=1 to n do
d:=d+abs(a[i,j]-a[i-1,j]);
{Dem so khoi nhin thay theo chieu doc giua cac cot}
forj:=2 to n do
for i:=1 to m do
d:=d+abs(a[i,j]-a[i,j-1]);
{Dem mat tren}
fori:=1 to m do
for j:=1 to n do

if a[i,j]>0 then d:=d+1;
end;
BEGIN
DocTep;
Xem;
Dem;
writeln(d);
END.
Du lieu test:
COT.INP
3 4
1 0 3 1
2 2 0 1
0 0 1 4
Ket qua du kien: 5 4
Dưới đây là chương trình viết bằng ngôn ngữ C trong môi trường Turbor C hoặc C
++
.
Chương trình C
/*SONCOT.C*/
#include
#include
#include
#define fn "COT.INP"
#define MN 100
#define byte unsigned char
void DocTep();
void Xem();
void Dem();
FILE *f;

byte a[MN][MN];
long d; /*Dien tich can so*/
int m,n;
main()
{clrscr();
DocTep();
Xem();
Dem();
printf("%d",d);
getch();
}
/*Doc du lieu tu tep vao mang a */
void DocTep()
{byte i,j;
f=fopen(fn,"rt");
fscanf(f, "%d", &m, &n);
for (i=0; i<>
for (j=0; j<>
fscanf(f, "%d", &a[i][j]);
fclose(f);
}
/* Hien thi du lieu tren man hinh de kiem tra */
void Xem()
{byte i,j;
prinf("m=%d n=%d n",m,n);
for (i=0;i<M;++I)< p>

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×