Nguyen Ly Vet Can P Pascal

You might also like

Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 5

Gv: Nguyễn Trung Nhẫn - Phương pháp vét cạn

Phương pháp vét cạn toàn bộ.


Muốn tìm được cây kim trong đống rơm, hãy lần lượt rút từng cọng rơm cho đến khi
rút được cây kim
Mô tả tuật toán:
Gọi D là không gian của bài toán (tập tất cả các khả năng có thể xảy ra của bài
toán)
D = tập tất cả các bộ (x1, x2, …, xn)
Trong đó:
X1 Î D1
X2 Î D2

Xn Î Dn
Và Di là các tập hữu hạn có số phần tử mi
Gọi quy tắc xác định lời giải là một ánh xạ f
f : D à {True, False}
Để tìm kiếm lời giải bài toán ta lần lượt xét tất cả các phần tử của tập D, nếu phần tử
x=(x1,x2,…, xn) thỏa f(X)= True thì X là một lời giải của bài toán
Coloigiai:=false;
For " x1 Î D1 do
For " x2 Î D2 do
….
For " xn Î Dn do
If f(x1,x2,..,xn)=True then
begin
<x1, x2, …, xn> là 1 lời giải
coloigiai:=true
end;
If coloigiai= False then <bai toan vo nghiem>
VD1. Vừa gà vừa chó 36 con, bó lại cho tròn 100 chân chẵn. Tìm số gà, số chó mỗi loại?
HD. Ta có D = D1 x D2
D1: tập các giá trị mà số gà có thể nhận D1=[1..36] à ga
D2: tập các giá trị mà số chó có thể nhận D2=[1..25] à cho
Điều kiện nhận kết quả
 Đk1: ga+cho =36
 Đk2: ga x 2 + cho x 4 =100
Code tham khảo
var ga, cho:byte;
begin
for ga:=1 to 36 do
for cho:=1 to 25 do
if (ga+cho=36) and (ga*2+cho*4=100) then write(ga:4,cho:4);
readln
end.
VD2. LỚP HỌC MÚA

1
Gv: Nguyễn Trung Nhẫn - Phương pháp vét cạn

Lớp học múa khiêu vũ dạ hội của giáo sư Padegras có n học sinh nam và nữ ghi tên.
Giáo sư cho tất cả học sinh xếp thành một hàng dọc và chọn một nhóm các học sinh liên
tiếp nhau cho buổi học đầu tiên với yêu cầu là số học sinh nam và nữ phải bằng nhau.
Hãy xác định, giáo sư Padegras có bao nhiêu cách lựa chọn khác nhau cho buổi học
đầu tiên.
Dữ liệu: Vào từ file văn bản DANCE.INP:
Dòng đầu tiên chứa số nguyên n (1 ≤ n ≤ 106),
Dòng thứ 2 chứa xâu độ dài n bao gồm các ký tự từ tập {a, b} xác định dòng xếp hàng, a
là nam, b – nữ.
Kết quả: Đưa ra file văn bản DANCE.OUT một số nguyên – số cách lựa chọn.
Ví dụ:
DANCE.INP DANCE.OUT
8
abbababa 13
Kiểm tra các xâu con k ký tự liên tiếp nhau, với k = 2 ÷ n.

Phát biểu lại bài toán: Đếm xem có bao nhiêu xâu con có số kí tự a bằng số kí tự b
function compare(st:string):boolean;
var x,y,j:integer;ss:boolean;
begin
x:=0;y:=0;
for j:=1 to length(st) do
begin
if st[j]='a' then inc(x);
if st[j]='b' then inc(y);
end;
if x=y then ss:=true else ss:=false;
compare:=ss;
end;
Code tham khảo
procedure xuly;
begin
k:=0;
repeat
k:=k+1;
for i:=1 to n-k+1 do
for j:=i+k-1 to n do
if compare(copy(s,i,j-i+1)) then inc(dem);
until k<=n;
end;

2
Gv: Nguyễn Trung Nhẫn - Phương pháp vét cạn

BÀI TẬP:
Bài 1: Nhập vào dãy n số nguyên dương
Yêu cầu:
 Sắp dãy số không tăng
 In ra các cặp số nguyên tố song sinh (số nguyên tố song sinh là các cặp số nguyên
tố có hiệu bằng 2
Vd. 12 3 4 5 7 120 12 14 15
à 120 15 14 12 7 5 4 3
à Co cac cap so nguyen to song sinh la:
7 va 5
5 va 3
Code tham khảo
procedure sapxep;
var tam:integer;
begin
for i:=1 to n-1 do
for j:=i+1 to n do
if a[i]<a[j] then
begin
tam:=a[i];
a[i]:=a[j];
a[j]:=tam;
end;
end;
Function ktnt(n:integer):boolean;
Var kt:boolean;
j:integer;
Begin
kt:=true;
for j:=2 to n div 2 do
if n mod j=0 then kt:=false;
ktnt:=kt;
End;
Code tham khảo
procedure xuly;
begin
for i:=1 to n-1 do
for j:=i+1 to n do
if ktnt(a[i]) and ktnt(a[j]) and (a[i]-a[j]=2) then
writeln(a[i],' va ',a[j]);
end;
BÀI 2: Mật khẩu
Một xâu kí tự được gọi là mật khẩu “an toàn” nếu xâu có độ dài ít nhất 6 kí tự và xâu
chứa ít nhất một chữ cái in hoa (‘A’ .. ‘Z’), một chữ cái in thường (‘a’..’z’), một chữ số
(‘0’..’9’).
Ví dụ, ‘a1B2c3’, ‘tinHoc6’ là các mật khẩu an toàn, ‘tinhoc’, ‘a1B2c’ là các mật khẩu
không an toàn.
Yêu cầu: Cho xâu S, tính số lượng xâu con là mật khẩu an toàn
3
Gv: Nguyễn Trung Nhẫn - Phương pháp vét cạn

Dữ liệu vào: File xau.inp gồm một dòng chứa xâu S


Kết quả: Xuất ra file matkhau.out mọt số nguyên là số lượng xâu con là mật khẩu an
toàn.
Code tham khảo
procedure try;
var x1,x2,n:longint;
begin
n:=length(s);
count:=0;
for x1:=1 to n do
for x2:=1 to n do
if isOK(x1,x2) then count:=count+1;
end;
----------
function isOK(x1,x2:longint):boolean;
begin
isOK:=(x2-x1>=5)
and (checkHAZ(x1,x2))
and (checkLaz(x1,x2))
and (check09(x1,x2));
end;
----------------
function check09(x1,x2:longint):boolean;
var i:integer;
kt:boolean;
begin
kt:=false;
for i:=x1 to x2 do
if (s[i]>='0') and (s[i]<='9') then kt:=true;
check09:=kt
end;
--------
function checkHAZ(x1,x2:longint):boolean;
var i:integer; kt:boolean;
begin
kt:=false;
for i:=x1 to x2 do
if (s[i]>='A') and (s[i]<='Z') then kt:=true;
checkHAZ:=kt;
end;
function checklaz(x1,x2:longint):boolean;
var i:integer; kt:boolean;
begin
kt:=false;
for i:=x1 to x2 do
if (s[i]>='a') and (s[i]<='z') then kt:=true;
checkLaz:=kt;
end;

4
Gv: Nguyễn Trung Nhẫn - Phương pháp vét cạn

Bài 3: Đếm tàu


Một tệp văn bản có tên fn có ghi sơ đồ một vùng biển hình chữ nhật chiều ngang
250 kí tự, chiều dọc (số dòng) không hạn chế. Trên biển có các con tàu hình chữ nhật
chứa các kí tự 1, vùng nước được biểu thị qua các kí tự 0. Biết rằng các con tàu không
dính nhau. Hãy đếm số lượng tàu.
Ví dụ, hình bên có 4 tàu.
56
000000
011001
000001
011000
000011
Hướng dẫn giải:
Nhận xét:
Để đếm số tàu ta chỉ cần đếm các mũi tàu (nghĩa là ô trên cùng bên trái của tàu là đủ
vì tàu là các khối hình chữ nhật số 1).
Bài toán có thể phát biểu lại: đếm các ô (i,j) mà giá trị a[i,j]=1 và a[i-1,j]=0 và a[I,j-1]=0
Code tham khảo
procedure xuly;
begin
dem:=0;
for i:=1 to n do
for j:=1 to m do
if (a[i,j]=1) and (a[i-1,j]=0) and (a[i,j-1]=0) then inc(dem);
end;

You might also like