You are on page 1of 38

PHNG PHP TH SAI

Chuyn ny trnh by phng php Th sai. Cng nh cc phng php


khc nh Tham n, Chia tr v Quy hoch ng, y l chin lc tng qut.
Phng php ny ch l chin lc, c tnh nh hng tm thut ton. Vic p
dng phng php tm ra thut ton cho mt bi ton c th cn i hi nhiu
sng to. Trong chuyn ny, ngoi phn trnh by v phng php, chuyn
cn c nhng v d c th, cng vi thut gii v ci t, c ci nhn chi tit t
vic thit k gii thut n xy dng chng trnh.
1. Phng php th sai
Trong nhiu bi ton, vic tm nghim c th quy v vic tm vector hu hn
(

), trong ( di vector) c th xc nh trc hoc khng. Vector


cn tm phi tha mn mt s iu kin ty thuc vo yu cu ca bi ton. Cc
thnh phn

c chn ra t tp hu hn

. Tu vo mc ch bi ton, c th
phi tm mt nghim, tm tt c nghim hoc m s nghim.
Mt suy ngh rt t nhin gii quyt bi ton l: ln lt lit k c cc kh nng
ca nghim (theo dng vector), vi mi kh nng tin hnh kim tra kh nng c
l nghim khng? (c tha mn cc yu cu ca bi ton hay khng?) Hng gii
quyt nh vy ta gi l th sai.
V d: Cho dy s nguyn

(|

) v mt s nguyn (

), thc hin cc yu cu sau:


1) m s lng dy con lin tip ca dy

c s phn t ln hn 3
v tng cc phn t bng .
2) Chn ba phn t trong dy m tch ba phn t l ln nht.
3) Lit k tt c cc cch chn mt tp gm cc s trong dy tng cc s
trong tp c chn bng .
Phn tch v d:
1) Vector nghim ca bi ton ny l (

), trong

, -)
l hai ch s ca dy

. Ta c th th tt c cc dy con c di
ln hn 3 bng cch th tt c cc b (

) vi

, kim tra xem

bng hay khng?


2) Vector nghim ca bi ton ny l (

), trong

, -) l ba ch s ca dy

. Ta c th th
tt c cc b ba ch s

vi

chn ba phn
t c ln nht.
3) Vector nghim ca bi ton ny l (

), trong

,-,

nu phn t th khng c chn vo tp,

nu phn t th
c chn vo tp. Ta c th th tt c cc dy

vi

,-,
kim tra xem

bng hay khng?


Khi gii bi ton bng phng php th sai chng ta thng xy dng:
- Xy dng th tc thc hin vic lit k cc kh nng;
- Xy dng hm kim tra mt kh nng c tha mn cc iu kin bi hay
khng?
phc tp ca thut ton theo phng php th sai
D dng thy c phc tp ca thut ton theo phng php th sai s bng: s
kh nng th nhn vi chi ph trung bnh kim tra mt kh nng.
2. Nhng vn cn ch khi gii bi ton bng phng php th sai
2.1. on nhn vector nghim
gii bi ton bng phng php th sai, vic u tin phi lm l phi xc nh
c vector nghim, c th phi xc nh: vector nghim gm bao nhiu thnh
phn ( ngha mi thnh phn), min gi tr ca tng thnh phn v cc rng buc
gia cc thnh phn. y l cng vic quan trng mang ngha quyt nh n
vic gii quyt bi ton.
2.2. Gim thiu s trng hp phi th, gim thiu chi ph kim tra
Quan st cch tnh phc tp thut ton theo phng php th sai ( phc tp
ca thut ton theo phng php th sai bng s kh nng th nhn vi chi ph
trung bnh kim tra mt kh nng) ta nhn thy, gim phc tp thut ton ta
c th gim thiu s kh nng phi th hoc gim chi ph kim tra.
3. Mt s v d minh ha
3.1. Bi ton MT KHU
Mt xu k t c gi l mt khu an ton nu xu c di t nht bng 6 v
xu cha t nht mt ch ci in hoa ( ), mt ch ci thng ( ), mt
ch s ( ).
V d, , l hai mt khu an ton, cn
u khng phi l mt khu an ton.
Mt ln, Bnh nhn thy mt xu , ch gm cc loi k t: ch ci in hoa, ch ci
thng v ch s. Bnh mun t kim tra kh nng on nhn mt khu bng cch
m xem c bao nhiu cp ch s ( ) tha mn iu kin:
() v xu con gm cc k t lin tip t n ca l mt khu an
ton.
Yu cu: Cho xu , tnh s lng cp ch s ( ) tha mn iu kin nu trn.
D liu: Vo t file vn bn MATKHAU.INP gm mt dng cha xu c di
khng qu

.
Kt qu: Ghi ra file vn bn MATKHAU.OUT mt s nguyn l s lng cp ch
s ( ) tnh c.
V d:
MATKHAU.INP MATKHAU.OUT MATKHAU.INP MATKHAU.OUT
abc3456789PQ 6 abc123 0

3.1.1. Li gii (

)
Xc nh vector nghim: (

) trong

() tng ng l
cp ch s ( ).
Xc nh rng buc: Trong xu , t v tr

n v tr

phi xut hin ch in hoa


( ), mt ch ci thng ( ), mt ch s ( ) v

.
lit k tt c cc kh nng ta c th s dng hai vng lp lng nhau, c th th
tc lit k nh sau:
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;
Trong th tc trn, bin S l bin ton cc, lu xu S d liu vo; bin count l bin
ton cc dng m s lng cp tha mn; hm isOK(x1,x2) nhn hai tham s
u vo l hai ch s ca xu S c nhim v kim tra rng buc, tr v TRUE nu
tha mn rng buc, FALSE trong trng hp ngc li. Trong hm ny ta s phi
kim tra cc iu kin sau:
1)

;
2) T v tr

n v tr

ca xu S c k t thuc [A..Z]
3) T v tr

n v tr

ca xu S c k t thuc [a..z]
4) T v tr

n v tr

ca xu S c k t thuc [0..9]
Hm isOK(x1,x2) c th nh sau:
function isOK(x1,x2:longint):boolean;
begin
isOK:= (x2-x1>=5)
and(checkHAZ(x1,x2))
and(checkLaz(x1,x2))
and(check09(x1,x2));
end;
Trong hm checkHAZ(x1,x2) kim tra iu kin th 2 (t v tr

n v tr

ca xu S c k t thuc [A..Z]). Hm ny tr v gi tr TRUE nu tha,


FALSE trong trng hp ngc li. Tng t checkLaz(x1,x2) kim tra iu
kin th 3, check09(x1,x2) kim tra iu kin 4.
function checkHAZ(x1,x2:longint):boolean;
var i : longint;
begin
for i:=x1 to x2 do
if (S[i]>='A')and(S[i]<='Z') then exit(TRUE);

exit(FALSE);
end;

function checklaz(x1,x2:longint):boolean;
var i : longint;
begin
for i:=x1 to x2 do
if (S[i]>='a')and(S[i]<='z') then exit(TRUE);

exit(FALSE);
end;

function check09(x1,x2:longint):boolean;
var i : longint;
begin
for i:=x1 to x2 do
if (S[i]>='0')and(S[i]<='9') then exit(TRUE);

exit(FALSE);
end;

Tuy nhin, ta nhn thy ba hm kim tra trn c th thu gn thnh hm check di
y.
function check(x1,x2:longint; c1,c2:char):boolean;
var i : longint;
begin
for i:=x1 to x2 do
if (S[i]>=c1)and(S[i]<=c2) then exit(TRUE);

exit(FALSE);
end;

Chng trnh hon chnh theo cch gii trn
const fi ='MATKHAU.INP';
fo ='MATKHAU.OUT';

var S :ansistring;
count :int64;

function check(x1,x2:longint; c1,c2:char):boolean;
var i :longint;
begin
for i:=x1 to x2 do
if (S[i]>=c1)and(S[i]<=c2) then exit(TRUE);

exit(FALSE);
end;

function isOK(x1,x2:longint):boolean;
begin
isOK:= (check(x1,x2,'A','Z'))
and(check(x1,x2,'a','z'))
and(check(x1,x2,'0','9'));
end;

procedure try;
var x1, x2, n :longint;
begin
n:=length(S);
count:=0;
for x1:=1 to n-5 do
for x2:=x1+5 to n do
if isOK(x1,x2) then count:=count+1;
end;

procedure readFile;
var f :text;
begin
assign(f,fi); reset(f);
readln(f,S);
close(f);
end;

procedure writeResult;
var f :text;
begin
assign(f,fo); rewrite(f);
writeln(f,count);
close(f);
end;

BEGIN
readFile;
try;
writeResult;
END.

Trong chng trnh trn, th tc try c thay i nhm mc ch ch th cc
trng hp m

, do gim s trng hp phi th gim v trong th


tc check cng khng cn phi kim tra iu kin

. phc tp ca
thut ton: S trng hp phi th (

) nhn vi chi ph kim tra (), do


phc tp thut ton trn l: (

).
Chng trnh trn bin S thuc kiu d liu ansistring (kiu xu k t cho php
di ln hn 255) v di xu vo ln ti 10
6
, bin count thuc kiu int64 (min
gi tr -2
63
n 2
63
-1) v s lng c th vt qu kiu longint khi di xu ln ti
10
6
. Kiu ansistring v int64 l hai kiu d liu c trong freepascal.
3.1.2. Li gii (

)

phc tp ca li gii trn l (

) vi l di xu S. gim phc tp
th phi gim s trng hp phi th hoc gim chi ph phn kim tra. D nhn
thy c th gim chi ph kim tra theo nhn xt sau: vic kim tra (

) c th
kim tra nhanh trong () khi kim tra (

). Nh vy phc tp thut
ton ch cn (

).
3.1.3. Li gii ()
Ta c th gim s trng hp phi th t (

) v () bng nhn xt sau: nu


(

) tha mn th (

) cng tha mn, nh vy vi mi

ta xc nh

nh nht (

) tha mn th

- u tha mn, c

v tr tha mn cho

. Nh vy ch cn th

, s lng

tha mn
(tng ng vi

) d dng tnh c.
Vi

cch xc nh

nh sau:

+ trong

l v tr nh nht ln hn

m t

c xut hin k t thuc


[A..Z], tng t

l v tr nh nht ln hn

m t

c xut
hin k t thuc [a..z],

l v tr nh nht ln hn

m t

c
xut hin k t thuc [0..9]. Vic xc nh

c th xc nh bng
cch chun b trc. Di y l chng trnh hon chnh.

const MAX =1000000;
fi ='MATKHAU.INP';
fo ='MATKHAU.OUT';

var next :array[1..MAX,'1'..'3']of longint;
s :ansistring;
n :longint;
count :int64;

procedure readFile;
var f :text;
i :longint;
c :char;
begin
assign(f,fi); reset(f);
readln(f,s);
n:=length(s);
close(f);

for i:=1 to length(s) do
if (s[i]>='0') and (s[i]<='9') then s[i]:='1'
else if (s[i]>='a')and(s[i]<='z') then s[i]:='2'
else s[i]:='3';

for c:='1' to '3' do next[n,c]:=n+1;

next[n,s[n]]:=n;
for i:=n-1 downto 1 do
begin
for c:='1' to '3' do next[i,c]:=next[i+1,c];
next[i,s[i]]:=i;
end;
end;

procedure try;
var i,j :longint;
c :char;
begin
count:=0;
for i:=1 to n-5 do begin
j:=i+5;
for c:='1' to '3' do
if next[i,c]>j then j:=next[i,c];

if (j<=n) then
count:=count + (n-j+1)
end;

end;

procedure writeResult;
var f :text;
begin
assign(f,fo); rewrite(f);
writeln(f,count);
close(f);
end;

BEGIN
readFile;
try;
writeResult;
END.
3.2. Bi ton DY DN
Cho on dy in (

). on dy th c di

cm (

). Cn phi ct cc on cho thnh cc on sao cho c c on dy


bng nhau c di nguyn. C th khng cn ct ht cc on dy cho. Mi
on dy b ct c th c phn cn tha khc 0.
Yu cu: Xc nh di ln nht ca on dy c th nhn c. Nu khng c
cch ct th a ra s 0.
D liu: Vo t file vn bn WIRES.INP c dng
- Dng u tin cha hai s nguyn
- Dng th trong dng sau cha s nguyn

.
Kt qu: a ra file vn bn WIRES.OUT, kt qu trn mt dng di dng s
nguyn.
V d:
WIRES.INP WIRES.OUT
4 11
802
743
547
539
200
3.2.1. Li gii ()
Ta th ln lt di cn tm (

) t nh n ln (hoc ln v nh), sau tin


hnh kim tra xem c ct c on c di

khng?

const MAX =100000;
fi ='wires.inp';
fo ='wires.out';

var n,k,res :longint;
l :array[1..MAX]of longint;

procedure readFile;
var f :text;
i :longint;
begin
assign(f,fi); reset(f);
readln(f,n,k);
for i:=1 to n do readln(f,l[i]);
close(f);
end;

function isOK(x1:longint):boolean;
var i, count : longint;
begin
count:=0;
for i:=1 to n do
count:=count + l[i] div x1;
isOK:=count>=k;
end;

procedure try;
var i,x1,lmax : longint;
sum : int64;
begin
sum:=0;
for i:=1 to n do sum:=sum+l[i];
lmax:=sum div k;

res:=0;
for x1:=1 to lmax do
if isOK(x1) then res:=x1;
end;

procedure writeResult;
var f :text;
begin
assign(f,fo); rewrite(f);
writeln(f,res);
close(f);
end;

BEGIN
readFile;
try;
writeResult;
END.
Trong chng trnh trn, hm isOK s kim tra xem vi di

c th c cch
ct c thnh on hay khng? Chi ph kim tra l ()
S lng th

ph thuc vo di ca cc on dy m di cc on dy c
th ln ti 10
9
.
3.2.2. Li gii ()
Ta c nhn xt sau: nu di

c th ct c thnh on th ng nhin ta
c th ct c thnh on c di

. T nhn xt ny ta s gim thiu s


trng hp phi th bng thut ton chia nh phn, c th thay th tc try bng th
tc bs_try nh sau:

procedure bs_try;
var i,x1,lmin,lmax :longint;
sum :longint;
begin
sum:=0;
for i:=1 to n do sum:=sum+l[i];
lmax:=sum div k;
lmin:=1;

while lmax>lmin do begin
x1:=(lmax+lmin) div 2;
if isOK(x1) then begin
res:=x1;
lmin:=x1 + 1;
end
else lmax:=x1 - 1;
end;

end;
4. Quay lui vt cn
Nu vector nghim n gin ta c th dng cc vng lp lit k. Tuy nhin,
trong mt s trng hp vector nghim phc tp th ta thng lit k bng th tc
quay lui vt cn.
Xt bi ton 8 qun hu.
Cn t 8 qun hu vo bn c vua , sao
cho chng khng tn cng nhau, tc l khng c
hai qun hu no cng hng, cng ct hoc cng
ng cho.
V d: hnh bn l mt cch t hu tha mn
yu cu bi ton, cc c t mu l v tr t
hu.

Xc nh vector nghim: Do cc qun hu phi nm trn cc hng khc nhau, ta
nh s cc qun hu t 1 n 8, qun hu i l qun hu nm trn hng th i
(i=1,2,,8). Gi

l ct m qun hu i ng. Nh vy nghim ca bi ton l


vector (

), trong

, tc l

c chn t tp

* +. Vector (

) l nghim nu

v hai (

) (

)
khng nm trn cng mt ng cho. V d: (1,5,8,6,3,7,2,4) l mt nghim.
4.1. Quay lui vt cn
T tng ca phng php quay lui vt cn nh sau: Ta xy dng vector
nghim dn tng bc, bt u t vector khng ( ). Thnh phn u tin

c
chn ra t tp

. Gi s chn c cc thnh phn

th t
cc iu kin ca bi ton ta xc nh c tp

(cc ng c vin c th chn lm


thnh phn

l tp con ca

). Chn mt phn t

ta m rng nghim
c

. Lp li qu trnh trn tip tc m rng nghim. Nu khng


th chn c thnh phn

rng) th ta quay li chn mt phn t khc


ca

cho

. Nu khng cn mt phn t no khc ca

ta quay li chn mt
phn t khc ca

lm

v c th tip tc. Trong qu trnh m rng nghim,


ta phi kim tra nghim ang xy dng l nghim ca bi ton cha. Nu ch
cn tm mt nghim th khi gp nghim ta dng li. Cn nu cn tm tt c cc
nghim th qu trnh ch dng li khi tt c cc kh nng la chn ca cc thnh
phn ca vector nghim b vt cn.
Lc tng qut ca thut ton quay lui vt cn c th biu din bi th tc
sau:
procedure Backtrack;
begin
S1:=A1;
k:=1;
while k>0 do begin
while Sk <> do begin
<chn xk Si>;
Sk:=Sk {xk};
if (x1, x2,,xk) l nghim then <a ra
nghim>;
k:=k+1;
<Xc nh Sk>;
end;
k:=k-1; // quay lui
end;
end;
Trn thc t, thut ton quay lui vt cn thng c dng bng m hnh quy
nh sau:
procedure Backtrack(i);// xy dng thnh phn th i
begin
<Xc nh Si>;
for xi Si do begin
<ghi nhn thnh phn th i>;
if (tm thy nghim) then <a ra nghim>
else Backtrack(i+1);
<loi thnh phn i>;
end;
end;
Khi p dng lc tng qut ca thut ton quay lui cho cc bi ton c th,
c ba vn quan trng cn lm:
- Tm cch biu din nghim ca bi ton di dng mt dy cc i tng
c chn dn tng bc (

).
- Xc nh tp

cc ng c vin c chn lm thnh phn th i ca nghim.


Chn cch thch hp biu din

.
- Tm cc iu kin mt vector chn l nghim ca bi ton.
4.2. Mt s v d p dng
4.2.1. T hp
Mt t hp chp k ca n l mt tp con k phn t ca tp n phn t.
Chng hn tp {1,2,3,4} c cc t hp chp 2 l:
{1,2}, {1,3, {1,4, {2,3}, {2,4}, {3,4}
V trong tp hp cc phn t khng phn bit th t nn tp {1,2} cng l tp
{2,1}, do , ta coi chng ch l mt t hp.
Bi ton: Hy xc nh tt c cc t hp chp k ca tp n phn t. n gin ta
ch xt bi ton tm cc t hp ca tp cc s nguyn t 1 n n. i vi mt tp
hu hn bt k, bng cch nh s th t ca cc phn t, ta cng a c v bi
ton i vi tp cc s nguyn t 1 n n.
Nghim ca bi ton tm cc t hp chp k ca n phn t phi tho mn cc iu
kin sau:
- L mt vector (

)
-

ly gi tr trong tp * +
- Rng buc:

vi mi gi tr i t n (v tp hp khng phn
bit th t phn t nn ta sp xp cc phn t theo th t tng dn).
Ta c: 1

, do tp

(tp cc ng c vin c
chn lm thnh phn th i) l t

n ( ). iu ny ng
cho c trng hp , ta thm vo

.
Sau y l chng trnh hon chnh, chng trnh s dng m hnh quy sinh
tt c cc t hp chp ca .
program ToHop;
const MAX =20;

type vector =array[0..MAX]of integer;

var x :vector;
n,k :integer;

procedure GhiNghiem(x:vector);
var i :integer;
begin
for i:=1 to k do write(x[i],' ');
writeln;
end;

procedure ToHop(i:integer);
var j:integer;
begin
for j := x[i-1]+1 to n-k+i do begin
x[i] := j;
if i=k then GhiNghiem(x)
else ToHop(i+1);
end;
end;

BEGIN
write(Nhap n, k:); readln(n,k);
x[0]:=0;
ToHop(1);
END.
V d v Input / Output ca chng trnh:
n = 4, k=2

1. 1 2
2. 1 3
3. 1 4
4. 2 3
5. 2 4
6. 3 4
Theo cng thc, s lng t hp chp k=2 ca n=4 l:

( ) ( )

( )


4.2.2. Chnh hp lp
Chnh hp lp chp k ca n l mt dy k thnh phn, mi thnh phn l mt phn
t ca tp n phn t, c xt n th t v khng yu cu cc thnh phn khc nhau.
Mt v d d thy nht ca chnh hp lp l cc dy nh phn. Mt dy nh phn
di m l mt chnh hp lp chp m ca tp 2 phn t {0,1}. Cc dy nh phn
di 3:
000, 001, 010, 011, 100, 101, 110, 111.
V c xt th t nn dy 101 v dy 011 l 2 dy khc nhau.
Nh vy, bi ton xc nh tt c cc chnh hp lp chp k ca tp n phn t yu
cu tm cc nghim nh sau:
- L mt vector (

)
-

ly gi tr trong tp * +
- Khng c rng buc no gia cc thnh phn.
Ch l cng nh bi ton tm t hp, ta ch xt i vi tp n s nguyn t 1 n n.
Nu phi tm chnh hp khng phi l tp cc s nguyn t 1 n n th ta c th
nh s cc phn t ca tp a v tp cc s nguyn t 1 n n.
{s dng mt mng x[1..n] biu din chnh hp lp.
Th tc quy sau sinh tt c chnh hp lp chp k
ca n}
procedure ChinhHopLap(i:integer);
var j:integer;
begin
for j := 1 to n do begin
x[i] := j;
if i=k then GhiNghiem(x)
else ChinhHopLap(i+1);
end;
end;
V d v Input / Output ca chng trnh:
n = 2, k=3 1. 1 1 1
2. 1 1 2
3. 1 2 1
4. 1 2 2
5. 2 1 1
6. 2 1 2
7. 2 2 1
8. 2 2 2
Theo cng thc, s lng chnh hp lp chp k=3 ca n=2 l:


4.2.3. Chnh hp khng lp
Khc vi chnh hp lp l cc thnh phn c php lp li (tc l c th ging
nhau), chnh hp khng lp chp k ca tp n (kn) phn t cng l mt dy k thnh
phn ly t tp n phn t c xt th t nhng cc thnh phn khng c php
ging nhau.
V d: C n ngi, mt cch chn ra k ngi xp thnh mt hng l mt chnh
hp khng lp chp k ca n.
Mt trng hp c bit ca chnh hp khng lp l hon v. Hon v ca
mt tp n phn t l mt chnh hp khng lp chp n ca n. Ni mt cch trc quan
th hon v ca tp n phn t l php thay i v tr ca cc phn t (do mi gi
l hon v).
Nghim ca bi ton tm cc chnh hp khng lp chp k ca tp n s
nguyn t 1 n n l cc vector tho mn cc iu kin:
- c k thnh phn: (

)
-

ly gi tr trong tp * +
- Rng buc: cc gi tr

i mt khc nhau, tc l

vi mi .
Sau y l chng trnh hon chnh, chng trnh s dng m hnh quy sinh
tt c cc chnh hp khng lp chp ca phn t.
program ChinhHopKhongLap;

const MAX =20;

type vector =array[0..MAX]of integer;

var x :vector;
d :array[1..MAX]of integer; { mng d
kim sot rng buc cc gi tr

i mt khc nhau,

vi mi }
n,k :integer;

procedure GhiNghiem(x:vector);
var i :integer;
begin
for i:=1 to k do write(x[i],' ');
writeln;
end;

procedure ChinhHopKhongLap(i:integer);
var j:integer;
begin
for j := 1 to n do
if d[j]=0 then begin
x[i] := j;
d[j] := 1;
if i=k then GhiNghiem(x)
else ChinhHopKhongLap(i+1);
d[j] := 0;
end;
end;

BEGIN
write(Nhap n, k(k<=n):); readln(n,k);
fillchar(d,sizeof(d),0);
ChinhHopKhongLap(1);
END.
V d v Input / Output ca chng trnh:
n = 3, k=3 1. 1 2 3
2. 1 3 2
3. 2 1 3
4. 2 3 1
5. 3 1 2
6. 3 2 1
Theo cng thc, s lng chnh hp khng lp chp k=3 ca n=3 l:

( ) ( )

( )

4.2.4. Bi ton xp 8 qun hu
Trong bi ton 8 qun hu, nghim ca bi ton c th biu din di dng
vector (

) tha mn:
1)

l ta ct ca qun hu ang ng dng th


,

* +.
2) Cc qun hu khng ng cng ct tc l


vi .
3) C th d dng nhn ra rng hai (x
1
,y
1
) v (x
2
,y
2
)
nm trn cng ng cho chnh (trn xung di)

nu: x
1
y
1
=x
2
y
2
, hai (x
1
,y
1
) v (x
2
,y
2
) nm trn cng ng cho ph (t di
ln trn) nu: x
1
+y
1
=x
2
+y
2
, nn iu kin hai qun hu xp hai (

) (

)
khng nm trn cng mt ng cho l: {
(

) (

)
(

) (

)

Do , khi chn c (

) th

c chn phi tha mn


cc iu kin:
{

vi mi
Sau y l chng trnh y , lit k tt c cc cch xp 8 qun hu ln bn c
vua 8x8.
program XepHau;

type vector =array[1..8]of integer;

var x :vector;

procedure GhiNghiem(x:vector);
var i :integer;
begin
for i:=1 to 8 do write(x[i],' ');
writeln;
end;

procedure XepHau(k:integer);
var Sk :array[1..8]of integer;
xk,i,nSk :integer;
ok :boolean;
begin
{Xc nh tp Sk l tp cc ng c vin c th chn
lm thnh phn xk}
nSk:=0;{lc lng ca tp Sk}
for xk:=1 to 8 do {th ln lt tng gi tr 1, 2,
,8}
begin
ok:=true; {kim tra gi tr c th chn lm ng
c vin cho xk c hay khng}
for i:=1 to k-1 do
if not((xk<>x[i])and(k-xk<>i-
x[i])and(k+xk<>i+x[i])) then
begin
ok:=false;
break;
end;

if ok then begin {c th chn lm ng c vin
cho xk ,kt np vo tp Sk}
inc(nSk);
Sk[nSk]:=xk;
end;
end;

{chn gi tr xk t tp Sk}
for i:=1 to nSk do begin
x[k]:=Sk[i];
if k=8 then GhiNghiem(x)
else XepHau(k+1);
x[k]:=0;
end;
end;

BEGIN
XepHau(1);
END.
Vic xc nh tp S
k
c th thc hin n gin v hiu qu hn bng cch s dng
cc mng nh du. C th, khi ta t hu i (i,x[i]), ta s nh du ct x[i]
(dng mt mng nh du nh bi ton chnh hp khng lp), nh du ng
cho chnh (i-x[i]) v nh du ng cho ph (i+x[i]).
const n =8;

type vector =array[1..n]of integer;

var cot :array[1..n]of integer;
cheoChinh :array[1-n..n-1]of integer;
cheoPhu :array[1+1..n+n]of integer;
x :vector;

procedure GhiNghiem(x:vector);
var i :integer;
begin
for i:=1 to n do write(x[i],' ');
writeln;
end;

procedure xepHau(k:integer);
var i :integer;
begin
for i:=1 to n do
if (cot[i]=0) and (cheoChinh[k-i]=0) and
(cheoPhu[k+i]=0) then
begin
x[k]:=i;
cot[i]:=1;
cheoChinh[k-i]:=1;
CheoPhu[k+i]:=1;

if k=n then GhiNghiem(x)
else xepHau(k+1);

cot[i]:=0;
cheoChinh[k-i]:=0;
CheoPhu[k+i]:=0;
end;
end;

BEGIN
fillchar(cot,sizeof(cot),0);
fillchar(cheoChinh,sizeof(cheoChinh),0);
fillchar(cheoPhu,sizeof(cheoPhu),0);

xepHau(1);
END.
Bi ton xp hu c tt c 92 nghim, mi nghim u tin m chng trnh tm
c l:
1. 1 5 8 6 3 7 2 4
2. 1 6 8 3 7 4 2 5
3. 1 7 4 6 8 2 5 3
4. 1 7 5 8 2 4 6 3
5. 2 4 6 8 3 1 7 5
6. 2 5 7 1 3 8 6 4
7. 2 5 7 4 1 8 6 3
8. 2 6 1 7 4 8 3 5
9. 2 6 8 3 1 4 7 5
10. 2 7 3 6 8 5 1 4
5. Bi tp p dng
Bi 1: DSEQ
Cho dy s nguyn A gm n phn t a
1
,a
2
, .., a
n
, tm cp ch s i, j tha mn:
DSEQ =|(

) (

)| t gi tr ln nht (vi 1 i < j n).


Input
- Dng u l s nguyn dng n (2 n 10
5
)
- Dng tip theo cha n s nguyn a
1
, a
2
, .., a
N
(|a
i
|<10
9
), cc s cch nhau
mt du cch.
Output
- Gm mt dng cha 2 s nguyn l DSEQ ln nht tm c v s cp ch
s tha mn (hai s cch nhau mt du cch).
DSEQ.INP DSEQ.OUT
5
1 -2 3 -4 -7
13 1

Bi 2: S ngun
Gi thit N l s nguyn dng. S nguyn M l tng ca N vi cc ch s ca n.
N c gi l ngun ca M. V d, N = 245, khi M = 245 + 2 + 4 + 5 = 256.
Nh vy, ngun ca 256 l 245.
Khng c g ng ngc nhin nu thy rng c nhng s khng c ngun v c s
li c nhiu ngun. V d, s 216 c 2 ngun l 198 v 207.
Yu cu: Cho s nguyn M (M c khng qu 100 ch s) hy tm ngun nh nht
ca n. Nu M khng c ngun th a ra s 0.
D liu: Vo t file vn bn GEN.INP :
Dng u tin cha s nguyn T s lng Tests,
T dng sau: mi dng cha mt s nguyn M.
Kt qu: a ra file vn bn GEN.OUT, mi kt qu a ra trn mt dng.
GEN.INP GEN.OUT
3
216
121
2005
198
0
1979

Bi 3: Hnh vung trn mt cu(Olympic sinh vin)

Bng ngn ng ph thng c th ni hnh hc Riemann nghin cu tnh cht cc
i tng hnh hc xc nh trn mt cu. Trong a
l, ta mt im trn mt cu thng c xc
nh bng v v kinh . Nhiu bi ton trong hnh
hc Riemann c th gii bng cc gii thut p dng
trong hnh hc Euclid. ghi nhn cc kt qu nghin
cu tm hiu Titan (mt v tinh ca sao Mc) ngi ta
cng to mt mng li kinh tuyn v v tuyn nh
i vi tri t, ch khc l cc v tuyn c nh s t 0 ( xch o) n N bn
cu bc v t 0 n N bn cu nam. Trn thc t cc v tuyn N v -N khng
phi l ng trn m suy bin thnh mt im. Cc kinh tuyn c nh s t 0
n N v pha ng v 0 n N v pha ty. Kinh tuyn N v N trng nhau v
cng to vi kinh tuyn 0 thnh mt ng trn. Cc kinh tuyn v v tuyn chia
H
n
h
v
u

n
g
0 1 2 3 4
1
2
3
-2 -3 -4
-1
-2
mt cu thnh cc tng t nh li vung trn mt phng (ca hnh hc
Euclid). Hnh vung (hiu theo ngha rng) trn mt cu l phn din tch c gii
hn bi hai kinh tuyn v hai v tuyn c s dc theo kinh tuyn bng s dc
theo v tuyn.
C bit, hnh vung c th l ton
b mt cu hoc ging tam gic nu
c mt cnh l v tuyn N (hoc
N). Din tch ca hnh vung c
nh ngha l s thuc hnh vung
. Nhng ca b mt Titan
c chp nh y c nh
du l 1, nhng cn li c nh
du 0.


Nhim v ca bn l vit mt chng trnh xc nh din tch hnh vung ln
nht c chp nh ca Titan.
V d hnh trn tng ng vi N = 4 v hnh vung ln nht chp nh c l
16 (lu rng kinh tuyn (N-1) v kinh tuyn N-1 l hai ng kinh tuyn lin k
vi ng kinh tuyn N).
Input
D liu vo gm nhiu b d liu tng ng vi nhiu test. Dng u tin
cha mt s nguyn dng khng ln hn 20 l s lng cc b d liu. Cc dng
tip theo cha cc b d liu.
Vi mi b d liu, dng u tin cha s nguyn N (1< N < 1800) l kch
thc ca bng. 2*N dng tip theo mi dng cha 2*N s nguyn c gi tr 0 hoc
1 m t cc trn tng vng trn trn mt cu theo cc v tuyn t N-1 n N, bt
u t kinh tuyn N (xem v d).
Output
0 1 2 3 4
1
2
3
0
0
1
0
1
0
1
0
0
1 0
0
0
0
0
0
0
1
0
1
1 1 1
1
1
1
1
1
1 1 1
1
1
1
1
1
1 1
1 1
1
1
1
1
1
1 1
0
0
0
0
0
0
0
0
0
0
0
0
0
0 0
0
1
-1 -2 -3 -4
-1
-2
-3
0 0 0 1 0 1 1 1
1 1 1 1 1 0 0 0
1 1 1 1 1 1 0 0
1 1 1 1 1 0 0 0
1 1 0 1 1 1 0 0
1 0 0 1 0 0 1 0
0 1 0 0 1 0 1 0
0 0 0 1 1 1 0 0
mt cu
D liu nhp








Bn s


ng bn
cu
Ty bn cu

imv -1,
kinh 1

imv 3,
kinh -3
Vi mi b d liu, ghi ra trn mt dng din tch hnh vung ln nht tm
c.

HV.INP HV.OUT
1
4
0 1 0 1 1 0 1 0
1 0 1 0 0 1 1 1
1 1 1 0 0 1 1 1
1 0 1 0 0 1 1 1
1 1 0 0 0 1 1 1
0 0 0 1 0 1 1 0
1 0 0 1 0 0 0 1
0 1 0 0 0 0 1 1
16
Bi 4: Lucky Numbers (Olympic sinh vin)
Trong mt s nc chu , 8 v 6 c coi l nhng ch s may mn. Bt c s
nguyn no ch cha ch s 8 v 6 c coi l s may mn, v d 6, 8, 66, 668, 88,
886 .
Nguyn l mt hc sinh rt thch ton. Nguyn thch cc s may mn nhng ch
thch cc s c dng
S = 8866
trong S c t nht mt ch s v ch s 6 v 8 khng nht thit phi ng thi
xut hin. V d, 8, 88, 6, 66, 86, 886, 8866 l cc s c dng S.
Cho trc mt s nguyn dng X (1 < X < 10 000), Nguyn mun tm s may
mn nh nht dng S, c khng qu 200 ch s v chia ht cho X.
Nhim v ca bn l vit mt chng trnh tm s cho Nguyn.
D liu vo
D liu vo gm nhiu b d liu tng ng vi nhiu test. Dng u tin
cha mt s nguyn dng khng ln hn 20 l s lng cc b d liu. Cc dng
tip theo cha cc b d liu.
Trn mi dng tip theo cha mt s nguyn X tng ng vi mi b d
liu.
D liu ra
Vi mi b d liu, ghi ra trn mt dng s may mn dng S nh nht chia
ht cho X. Trng hp khng tn ti s S c khng qu 200 ch s nh vy, ghi -1.
Num86.inp Num86.out
4
6
8
43
5
6
8
86
-1

Bi 5: Lt xu
C 16 ng xu xp thnh bng 4x4, mi ng xu c th p hoc nga nh hnh v
sau:
Mu en th hin ng xu p, mu trng th hin ng
xu nga.
Ti mi bc ta c php bin i sau: Chn mt ng
xu v thay i trng thi ca ng xu v tt c cc
ng xu nm cc chung cnh (p thnh nga, nga
thnh p). Cho trc mt trng thi cc ng xu, hy lp
trnh tm s php bin i t nht a v trng thi tt
c cc ng xu hoc u p hoc u nga.

D liu vo trong file COIN.INP c dng: Gm 4 dng, mi dng 4 k t w -
m t trng thi nga hoc b- m t trng thi p.
Kt qu ra file COIN.OUT c dng: Nu c th bin i c ghi s php bin
i t nht nu khng ghi Impossible
COIN.INP COIN.OUT COIN.INP COIN.OUT
bwbw
wwww
bbwb
bwwb
Impossible bwwb
bbwb
bwwb
bwww
4

Bi 6: Phn thng2
Tun l ngi thng cuc trong mt cuc thi Tm hiu kin thc v tr v c
nhn cc phn thng do cng ty XYZ ti tr. Cc phn thng c b tr trn
mt bng vung kch thc n n c dng mt li vung kch thc n v. Cc
dng ca bng c nh s t 1 n n, t trn xung di v cc ct ca bng
c nh s t 1 n n, t tri qua phi. nm trn giao ca dng i v ct j c
gi l (i, j) v trn cha mt mn qu c gi tr l a
ij
(1 i, j n).
nhn phn thng, Tun c php chn ng hai hnh vung khng giao nhau
(c th tip xc) kch thc k k chim trn mt s ca bng v nhn tt c cc
phn qu trong cc nm trong hai hnh vung .
Yu cu: Hy xc nh tng gi tr ln nht ca cc mn qu m Tun c th nhn
c.
D liu: Vo t file vn bn BONUS2.INP
Dng th nht cha hai s nguyn dng n, k (n 1000;

).
Dng th i trong s n dng tip theo cha n s nguyn khng m, s th j l
a
ij

(a
ij
1000).
Cc s trn cng mt dng c ghi cch nhau t nht mt du cch.
Kt qu: Ghi ra file vn bn BONUS2.OUT mt s nguyn duy nht l tng gi tr
ln nht ca cc mn qu m Tun c th nhn c.

BONUS2.INP BONUS2.OUT
4 2
9 9 1 1
9 9 1 1
1 8 8 1
1 8 8 1
68
Bi 7: Dy s
Cho dy s nguyn

. S

( ) c gi l mt s trung
bnh cng trong dy nu tn ti 3 ch s ( ) i mt khc
nhau, sao cho

)
Yu cu: Cho v dy s

. Hy tm s lng cc s trung bnh cng


trong dy.
D liu vo:
- Dng u ghi s nguyn dng ( )
- Dng th hai cha s nguyn

(|

)
Kt qu ra:
S lng cc s trung bnh cng trong dy.
Bi 8: WMT
Cho bng s A gm MxN , mi cha mt s nguyn khng m (A
ij
) c gi tr
khng vt qu 10
9
. Xt hng i v hng j ca bng, ta cn xc nh X
ij
nguyn :
ij ij ij
1 1
| | | |
N N
ik jk
k k
S A X A X
= =
| | | |
= +
| |
\ . \ .

t gi tr nh nht.
Tnh


D liu vo trong file WMT.INP c dng:
- Dng u l 2 s nguyn dng M, N (1<M, N<1001)
- M dng sau, mi dng N s
Kt qu ra file WMT.OUT c dng: gm mt s W
Bi 9: Khu vui chi
Bn khu vui chi XYZ l mt hnh ch nht c kch thc . Cc hng
ca hnh ch nht c nh s t trn xung di bt u t 1 n , cn cc ct
c nh s t tri sang phi, bt u t 1 n , nm v tr hng v ct gi
l ( ). Khu vui chi XYZ c mt cng vo t ti (1,1) v mt cng ra t ti
( ). Mi ( ) c b tr mt tr chi, gi v mi ln vo ( ) l

). Khch tham quan i vo khu


vui chi XYZ t (1,1). Ti mi , khch c th di chuyn sang cc chung cnh
vi (mi c th i qua nhiu ln v khng nht thit phi i qua tt c cc ),
sau i ra khi khu vui chi t ( ). Vo ngy ngh, nhn c bn khu
vui chi XYZ vi bng gi v ti tt c cc , Harry c bit quan tm n ba tr
chi mi t ti ba khc nhau (

) (

) (

), nn quyt nh tham
quan khu vui chi XYZ v n t nht hai trong ba .
Yu cu: Cho bn khu vui chi XYZ vi bng gi ti tt c cc v v tr ba
(

) (

) (

), tnh chi ph t nht m Harry phi tr khi thc hin quyt


nh ca mnh.
D liu: Vo t file vn bn XYZ.INP c dng:
- Dng u tin cha hai s nguyn ( ),
- Dng th hai gm 6 s nguyn

),
- dng tip theo, mi dng s nguyn dng l gi v ti cc .
Kt qu: a ra file vn bn XYZ.OUT mt s nguyn l chi ph t nht m Harry
phi tr khi thc hin quyt nh ca mnh.
Bi 10: V xe min ph
An sng thnh ph XYZ, hng ngy anh phi i lm t nh ti c quan bng xe
but. Thnh ph XYZ c nt giao thng c nh s t 1 n v tuyn xe
but hai chiu. Mi cp nt giao thng , c khng qu mt tuyn xe but hai
chiu, nu c th i t nt n nt (hoc t nt n nt ) vi gi v l

ng. V tr nh An nm nt giao thng 1 cn c quan nm nt giao


thng . la chn ng i t nh n c quan An lun chn theo ng i vi
chi ph t nht.
V d: thnh ph c 5 nt giao thng v 6 tuyn xe
but:
Tuyn 1: 1-2 gi v 10 ng; Tuyn 2: 2-5 gi v 10
ng,
Tuyn 3: 1-4 gi v 3 ng; Tuyn 4: 3-4 gi v 5
ng,

Tuyn 5: 3-5 gi v 3 ng; Tuyn 6: 1-3 gi v 20 ng.
ng i 1435 ht 11 ng l t nht.
Va qua An nhn c mt v i xe but min ph. V c th dng i xe but
min ph mt ln trn mt tuyn bt k. Vi v xe min ph ny An mun bit chi
ph t nht i t nh n c quan l bao nhiu.
Vi v d trn, ng i 135 c s dng v xe min ph (ti tuyn 1-3) ht 3
ng l t nht.
Yu cu: Cho bit cc tuyn xe but v gi v tng ng. Hy tm chi ph t nht
i t nh (nt giao thng 1) n c quan (nt giao thng ) vi v xe min ph
m An c.
D liu vo t file vn bn FT.INP c dng:
- Dng u tin ghi hai s nguyn dng v ( )
- dng sau, mi dng 3 s nguyn

)
m t c tuyn xe but ht

ng.
Hai s lin tip trn mt dng cch nhau mt du cch. D liu bo m lun c
ng i t 1 n .
Kt qu cho ra file vn bn FT.OUT c dng: mt s duy nht l chi ph t nht
i t nh (nt giao thng 1) n c quan (nt giao thng ) vi v xe min ph
m An c.

You might also like