1-Chỉ được dùng phép nhân, tính a mũ 28 với không hơn 6 phép nhân (khi Test, bạn nên cho a=2)
{Tinh a mu 28 chi dung khong hon 6 phep nhan}
Uses crt;
var a,b:longint;
Begin clrscr;
Write('Nhap a='); Readln(a);
a:=a*a;
a:=a*a; Writeln('a mu 4=',a);
b:=a; {luu a mu 4 vao b}
a:=a*a*a; Writeln('a mu 12=',a);
a:=a*a; Writeln('a mu 24=',a);
a:=a*b; Writeln('a mu 28=',a);
Readln
End
              
                                            
                                
            
 
            
                 214 trang
214 trang | 
Chia sẻ: tieuaka001 | Lượt xem: 854 | Lượt tải: 0 
              
            Bạn đang xem trước 20 trang nội dung tài liệu Bài tập Pascal cơ bản đến nâng cao, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
h:=readkey; 
 if ch=#27 then stop:=true; 
 End; 
 8 h 54 m 28/7/2017 
139 Thầy Trần Thông Quế 
Procedure Music; 
 Begin 
 sound(Mc[g][1]); 
 delay(mc[g][2]*8);{ delay(20000);} 
 nosound; 
 if g=210 then g:=1 else inc(g) 
 End; 
Procedure Try(i:integer); 
 Var j:integer; 
 Begin 
 j:=0; 
 repeat 
 inc(j); 
 if a[j] and b[i+j] and c[i-j] then 
 begin 
 h[i]:=j; 
 Put_Queen((i-1)*50+10,(j-1)*50+10); 
 Music; 
 a[j]:=false;b[i+j]:=false;c[i-j]:=false; 
 if i<8 then Try(i+1) 
 else Wait; 
 a[j]:=True;b[i+j]:=true;c[i-j]:=true; 
 Put_Queen((i-1)*50+10,(j-1)*50+10); 
 Music; 
 end; 
 until (j=8) or stop; 
 End; 
Procedure Search; 
 Var i:integer; 
 s:string[30]; 
 Begin 
 t:=0;g:=1; 
 stop:=false; 
 for i:=1 to 8 do a[i]:=true; 
 for i:=2 to 16 do b[i]:=true; 
 for i:=-7 to 7 do c[i]:=true; 
 Try(1); 
 str(t,s); 
 if stop then 
 s:='Da Tim Duoc '+s+' Loi Giai' 
 else 
 s:='Tong So Co '+s+' Loi Giai'; 
 setcolor(red); 
 settextstyle(2,0,6); 
 outtextxy(418,280,s); 
 setcolor(white); 
 settextstyle(2,0,7); 
 8 h 54 m 28/7/2017 
140 Thầy Trần Thông Quế 
 outtextxy(430,310,'Go Esc Ket Thuc !'); 
 repeat ch:=readkey until ch=#27; 
 End; 
BEGIN 
 Initgr; 
 Table; 
 Search; 
 Closegraph; 
END. 
= = = = = = = = = = = = = = = = = = = = = = 
PHẦN VIII. GRAPH THEORY & APPLICATIONS 
VIII.1-TÌM KIẾM TRÊN ĐỒ THỊ (tên khác: DUYỆT ĐỒ THỊ); TÔ 
MÀU ĐỒ THỊ; TÌM MIỀN LIÊN THÔNG CỦA ĐT. 
(Nếu quên OR lơ mơ về lý thuyết một vấn đề nào đó, các bạn nên đến thư viện – để mất ít tiền nhất- xem 
quyển: LÝ THUYÊT ĐỒ THỊ, nxb GIÁO DỤC 2012. Tác giả: Trần Thông Quế) 
A/ CÁC THUẬT TOÁN TÌM KIẾM (DUYỆT) TRÊN ĐỒ THỊ. 
1-Hãy cài đặt trực quan (đồ họa hóa code) hai thuật toán DBF và BFS trên cùng một bản Code (BÀI CƠ 
BẢN NHƯNG KHÔNG DỄ!). 
Yêu cầu: * Gõ ENTER để chuyển từ thuật toán DFS sang BFS và ngược lại, 
* Gõ ESC để thoát 
CODE: 
PROGRAM DFS_BFS_SEARCH; 
USES CRT,GRAPH; 
CONST R=15;DL=500;N=8;VC=100; {KHONG CO DUONG DI THI DAT VO CUC VC=100} 
C:ARRAY[1..8] OF INTEGER=(150,330,450,450,330,150,30,30); 
D:ARRAY[1..8] OF INTEGER=(30,30,150,330,450,450,330,150); 
CL:ARRAY[0..3] OF WORD=(BLUE,YELLOW,WHITE,WHITE); 
NL:ARRAY[0..3] OF WORD=(YELLOW,BLUE,RED,BLACK); 
TYPE CSD=0..VC; 
AR=ARRAY[CSD] OF CSD; 
QUEUE=RECORD 
REAR:CSD; 
ELEMENT:AR; 
END; 
VAR G:ARRAY[CSD,CSD] OF BOOLEAN; 
 8 h 54 m 28/7/2017 
141 Thầy Trần Thông Quế 
I,J,K,U:CSD; 
P:AR; 
(*-----------------------------------------------------------*) 
PROCEDURE INITGR; { KHOI TAO DO HOA} 
VAR GD,GM:INTEGER; 
BEGIN 
GD:=DETECT; 
INITGRAPH(GD,GM,'..\BGI'); 
IF (GRAPHRESULT GROK) THEN 
BEGIN 
WRITELN('LOI KHOI TAO DO HOA, GO ENTER KET THUC !'); 
READLN; 
HALT(1) 
END 
END; 
(*-----------------------------------------------------*) 
PROCEDURE ADD(X:CSD;VAR Q:QUEUE); {THEM PHAN TU TU DUOI HANG DOI} 
BEGIN 
WITH Q DO 
BEGIN 
REAR:=REAR+1; 
ELEMENT[REAR]:=X 
END; 
END; 
(*-----------------------------------------------------*) 
PROCEDURE DELETE(VAR Q:QUEUE;VAR X:CSD); {BOT PHAN TU KHOI HANG DOI} 
VAR K:CSD; 
BEGIN 
WITH Q DO 
BEGIN 
X:=ELEMENT[1]; 
FOR K:=1 TO REAR-1 DO ELEMENT[K]:=ELEMENT[K+1]; 
REAR:=REAR-1 
END; 
END; 
(*-----------------------------------------------------*) 
PROCEDURE VENUT(U:CSD;M1,M2:WORD); {VE CAC DINH DO THI} 
VAR ST:STRING[3]; 
BEGIN 
SETFILLSTYLE(1,M2); 
SETCOLOR(M1); 
FILLELLIPSE(C[U],D[U],R,R); 
STR(U,ST); 
OUTTEXTXY(C[U]-2,D[U]-2,ST); 
END; 
(*-------------------------------*) 
 8 h 54 m 28/7/2017 
142 Thầy Trần Thông Quế 
PROCEDURE LINK(X,Y:CSD;M:WORD); 
BEGIN 
SETCOLOR(M); 
LINE(C[X],D[X],C[Y],D[Y]); 
END; 
(*-------------------------------*) 
PROCEDURE DATA_AUTO_CREA; {TU DONG TAO DU LIEU NGAU NHIEN CHO PROG.} 
BEGIN 
RANDOMIZE; 
FOR I:=1 TO N DO 
BEGIN 
G[I,I]:=FALSE; 
FOR J:=I+1 TO N DO 
BEGIN 
G[I,J]:=RANDOM(3)=1; 
G[J,I]:=G[I,J] 
END; 
END; 
FOR I:=1 TO N DO 
BEGIN 
J:=0; 
REPEAT 
J:=J+1 
UNTIL G[I,J] OR (J=N); 
IF (J=N) AND (NOT G[I,N]) THEN 
BEGIN 
J:=1+RANDOM(N); 
IF J=I THEN IF I<N THEN J:=I+1 ELSE J:=I-1; 
G[I,J]:=TRUE;G[J,I]:=TRUE 
END; 
END; 
END; 
(*--------------------------------------------------*) 
PROCEDURE DEMO(ST:STRING); {IN TEN CAC VIEC} 
BEGIN 
SETCOLOR(WHITE); 
OUTTEXTXY(500,30,'Duyet Do Thi'); 
OUTTEXTXY(500,90,ST); 
SETCOLOR(YELLOW); 
OUTTEXTXY(490,150,'Go Enter Tiep Tuc ...'); 
SETCOLOR(RED); 
OUTTEXTXY(490,210,'Go Esc Ket Thuc !'); 
END; 
(*--------------------------------------------------*) 
PROCEDURE PRINT_GRAPH; {IN DO THI} 
VAR ST:STRING[3]; 
 8 h 54 m 28/7/2017 
143 Thầy Trần Thông Quế 
BEGIN 
SETBKCOLOR(BLUE);CLEARDEVICE; 
SETFILLSTYLE(1,DARKGRAY); 
BAR(0,0,GETMAXY,GETMAXY); 
FOR I:=1 TO N DO 
FOR J:=1 TO N DO IF G[I,J] THEN LINK(I,J,NL[0]); 
LINE(C[I],D[I],C[J],D[J]); 
FOR I:=1 TO N DO VENUT(I,CL[0],NL[0]); 
END; 
(*--------------------------------------------------*) 
PROCEDURE VE_GR_BFS(U:CSD); {HIEN THI DO THI DE DUYET THEO BE RONG} 
VAR Q:QUEUE; 
BEGIN 
VENUT(U,CL[K],NL[K]); 
P[U]:=0; 
Q.REAR:=0; 
ADD(U,Q); 
WHILE Q.REAR0 DO 
BEGIN 
DELETE(Q,I); 
FOR J:=1 TO N DO 
IF G[I,J] THEN 
IF P[J]=VC THEN 
BEGIN 
P[J]:=I; 
LINK(I,J,NL[K]); 
VENUT(J,CL[K],NL[K]); 
VENUT(I,CL[K],NL[K]); 
ADD(J,Q); 
DELAY(DL); 
END; 
END; 
END; 
(*--------------------------*) 
PROCEDURE BFS; {DUYET THEO CHIEU RONG} 
BEGIN 
FOR U:=1 TO N DO P[U]:=VC; 
K:=0; 
FOR U:=1 TO N DO IF P[U]=VC THEN 
BEGIN 
K:=(K+1) MOD 4; 
VE_GR_BFS(U);DELAY(DL) 
END; 
END; 
(*--------------------*) 
PROCEDURE VE_DT_DFS(U:CSD); {HIEN THI DO THI DE DUYET THEO CHIEU SAU} 
 8 h 54 m 28/7/2017 
144 Thầy Trần Thông Quế 
VAR T:CSD; 
BEGIN 
I:=I+1; 
P[U]:=I; 
FOR T:=1 TO N DO 
IF G[U,T] THEN 
IF P[T]=0 THEN 
BEGIN 
LINK(U,T,NL[K]); 
VENUT(U,CL[K],NL[K]); 
VENUT(T,CL[K],NL[K]); 
DELAY(DL); 
VE_DT_DFS(T); 
END; 
END; 
(*-----------------------------*) 
PROCEDURE DFS; {DUYET THEO CHIEU SAU} 
BEGIN 
FOR I:=1 TO N DO P[I]:=0; 
I:=0; 
FOR U:=1 TO N DO IF P[U]=0 THEN 
BEGIN 
K:=(K+1) MOD 4; 
VENUT(U,CL[K],NL[K]); 
VE_DT_DFS(U);DELAY(DL) 
END; 
END; 
(*-----------------------------------*) 
PROCEDURE PROC_CALL_PROC; {THU TUC GOI CAC THU TUC DUYET} 
VAR KT:CHAR; 
BEGIN 
IF KEYPRESSED THEN 
REPEAT KT:=READKEY UNTIL NOT KEYPRESSED; 
REPEAT 
DATA_AUTO_CREA; 
PRINT_GRAPH; 
DEMO('Theo Be Rong'); 
KT:=READKEY; 
IF KT=#27 THEN EXIT; 
BFS; 
KT:=READKEY; 
IF KT=#27 THEN EXIT; 
PRINT_GRAPH; 
DEMO('Theo Do Sau'); 
KT:=READKEY; 
IF KT=#27 THEN EXIT; 
 8 h 54 m 28/7/2017 
145 Thầy Trần Thông Quế 
DFS; 
KT:=READKEY; 
UNTIL (KT=#27); 
END; 
(*-----------------------------------*) 
BEGIN (* CHUONG TRINH CHINH *) 
CLRSCR; 
INITGR; 
PROC_CALL_PROC; 
CLOSEGRAPH; 
END. 
Thử một bài duy nhất ở mức TRÊN CƠ BẢN về duyệt theo BFS: 
2-(IOI-1996: THI OLYMPIC TIN HỌC QUỐC TẾ 1996) Tiếp theo thành tựu khối lập phương kỳ diệu, ông 
Rubik phát minh dạng cải biên phẳng của khối này và ông gọi đó là các ô vuông kỳ diệu. Đó là một bảng 8 
ô vuông có kích thước như nhau được tô màu khác nhau. 
Các màu tô được ký hiệu bởi 8 số nguyên dương đàu tiên (xem hình ngay trên) viết lần lượt theo chiều kim 
đồng hồ, bắt đầu từ ô góc trên cùng trái và kết thúc ở ô góc dưới cùng trái. 
Một cấu hình như trên gọi là cấu hình ban đầu. Ta thực hiện 3 phép biến đổi cơ bản ký hiệu là ‘A’, ‘B’, ‘C’ 
để tác động lên cấu hình của bảng, trong đó: 
• ‘A’: Đổi chỗ dòng trên và dòng dưới 
• ‘B’: Thực hiện phép hoán vị theo chiều sang phải vòng quanh bảng. 
• ‘C’: Quay theo chiều kim đồng hồ 4 ô ở giữa 
Mọi cấu hình đều có thể được tác động bởi 3 phép biến đổi cơ bản nói trên. Và tác động của 3 phép biến đổi 
cơ bản ấy mô tả bởi hình dưới đây: (Ở MỖI BỘ DATA DƯỚI ĐÂY CÁC SỐ TRÊN CÙNG VÀ DƯỚI 
CÙNG LÀ VỊ TRÍ CÁC Ô CỦA BẢNG) 
BẢNG 1 1 2 3 4  INDEX của các ô 
 8 7 6 5  INDEX của các ô 
 BẢNG 2 
1 2 3 4 
8 7 6 5 
1 2 3 4 
8 7 6 5 
4 1 2 3 
5 8 7 6 
 8 h 54 m 28/7/2017 
146 Thầy Trần Thông Quế 
BẢNG 3 
Các số ghi ở ngoài bảng chỉ vị trí các ô của bảng. Nếu một ô ở vị trí p chứa số i thì có nghĩa là sau khi làm 
phép biến đổi tương ứng, ô vuông mà vị trí trước lúc biến đổi của nó là i sẽ được chuyển đến vị trí p. 
a) Hãy viết program tìm dãy các phép biến đổi để đưa cấu hình ban đầu về một cấu hình đích cho trước. 
b) Bạn sẽ được thêm 2 điểm nếu số phép biến đổi của bạn không quá 300 
* Dữ liệu vào cất trên text file Data.in gồm: 
- Một dòng duy nhất chứa 8 số nguyên mô tả cấu hình đích. 
* Kết quả ghi lên text file Data.ou: 
-Dòng đầu tiên ghi số các phép biến đổi L 
- Tại L dòng tiếp theo ghi ký hiệu các phép biến đổi đã nói trên theo TRÌNH TỰ mà program của bạn đã 
thực hiện 
MỘT VÍ DỤ CỤ THỂ CỦA BÀI TOÁN NÀY CHO DƯỚI ĐÂY 
Data.In 
2 6 8 4 5 7 3 1 
Data.Ou 
7 
B 
C 
A 
B 
C 
C 
B 
Program MagicSquare; {BAI NAY DUYET DO THI THEO BFS) 
Uses crt; 
Const kt=8; m=40320; fi='Data.In'; fo='Data.Ou'; 
Type Bd=array[1..kt] of 1..kt; Ht=array[1..kt] of 1..kt; 
Const thuan:Array['A'..'C'] Of Bd=((8,7,6,5,4,3,2,1),(4,1,2,3,6,7,8,5), 
 (1,7,2,4,5,3,6,8)); {Cac b_doi co ban} 
 nguoc:Array['A'..'C'] of Bd=((8,7,6,5,4,3,2,1),(2,3,4,1,8,5,6,7), 
 (1,3,6,4,5,7,2,8)); {Nguoc cua b_doi} 
 dau:Ht=(1,2,3,4,5,6,7,8); {Trang thai ban dau} 
Var dic:Ht; {Bien luu trang thai dich} 
 s:String; {Day cac b_doi dua tr_thai dau den tr_thai dich} 
 fact:Array[0..kt] of Longint; {mang luu tu 0! den 8!} 
 last:Array[0..m] of Char; {last[sh(dic)] la ky tu cuoi cung cua day cac} 
 {b_doi dua trang thai dau ve trang thai dich} 
 {Neu last[sh(dic)]=' ' thi dich cung rong (tuc dich khong duoc sinh} 
Procedure Nhap; 
Var tepvao:text; i:word; 
Begin 
1 7 2 4 
8 6 3 5 
 8 h 54 m 28/7/2017 
147 Thầy Trần Thông Quế 
Assign(tepvao,fi); Reset(tepvao); 
For i:=1 to kt Do Read(tepvao,dic[i]); 
Close(tepvao); 
End; {Het nhap lieu} 
Procedure Facto; {Tinh giai thua} 
Var i:word; 
Begin 
 fact[1]:=1; fact[0]:=1; 
 For i:=2 to kt Do 
 fact[i]:=i*fact[i-1]; 
End; 
Function sh(p:Ht):Word; {ham sh de tinh so hieu cua mot hoan vi bat ky} 
Var res, L, i,j:Word; 
Begin 
res:=0; 
For i:=1 to kt Do 
Begin 
L:=0; {L- so cac phan tu cua p o cac vi tri tu 1->i-1 nhỏ hơn p[i]} 
For j:=1 to i-1 Do 
 If p[j]<p[i] Then Inc(L);{cố định i-1 p_tủ đầu tiên của p thì có 
 (p[i]-1-L)} 
{so nho hon p[i] tai cac vi tri i trong cac hoan vi} 
{So cac hoan vi q ma i-1 p_tu ®au tien giong nhu cua p} 
{nhung dung truoc p theo thu tu tu dien bang (p[i]-1-L)*fact(kt-i)} 
res:=res+(p[i]-1-L)*fact[kt-i]; 
End; {Het for cua i} 
sh:=res; 
End; {Ket thuc ham sh} 
Procedure App(dic:Ht; x:char; Var r:Ht); 
{Duoc r bang cach ap dung b_doi x len trang thai dich} 
Var i:word; 
Begin 
For i:=1 to kt Do r[i]:=dic[thuan[x][i]]; 
End; 
Procedure bd_nguoc(dic:Ht; x:Char; Var r:Ht); 
{Duoc r bang cach bien doi nguoc cua b_doi x len trang thai dic} 
Var i:Word; 
Begin 
For i:=1 to kt Do r[i]:=dic[nguoc[x][i]]; 
end; {Het bd_nguoc} 
Function bang(r, dic:ht):Boolean; {ham bang nhan g_tri True neu r=dic} 
Var i:Word; 
Begin 
bang:=true; 
For i:=1 to kt Do If r[i]dic[i] then 
Begin 
 8 h 54 m 28/7/2017 
148 Thầy Trần Thông Quế 
bang:=false; 
exit; 
End; 
End; 
Procedure sinh; {Tao day cac b_doi tu tr_thai dau de dat tr_thai dich} 
{last[sh(dic)] la phep b_doi cuoi cung cua day} 
Const qs=700; {kich thuoc danh sach} 
Var hdoi:Array[0..qs-1] of ht; {Khai bao hang doi chua cac b_doi} 
notfound:Boolean; 
head, tail, i, rankq:Word; 
r, s:Ht; x:Char; 
Begin 
For i:=0 to m Do last[i]:=' '; {khoi tri} 
last[0]:='.'; 
head:=0; tail:=1; 
hdoi[0]:=dau; 
notfound:=true; 
While notfound Do 
Begin 
r:=hdoi[head]; Inc(head); 
If head=qs Then head:=0; 
For x:='A' to 'C' Do 
Begin 
App(r, x, s); 
rankq:=sh(s); 
If last[rankq]=' ' Then 
Begin 
last[rankq]:=x; 
If bang(dic,s) Then 
Begin 
notfound:=false; 
break; 
End; 
hdoi[tail]:=s; 
Inc(tail); 
If tail=qs Then tail:=0; 
End; 
End; 
End; 
End; {ket thuc thu tuc sinh} 
Procedure tim; {kien tao cac phep bien doi} 
Var rankq:Word; x:Char; p,q:Ht; 
Begin 
q:=dic; rankq:=sh(q); s:=' '; 
While rankq0 do 
Begin 
 8 h 54 m 28/7/2017 
149 Thầy Trần Thông Quế 
x:=last[rankq]; 
s:=x+s; 
bd_nguoc(q,x,p); 
q:=p; 
rankq:=sh(q); 
End; 
End; 
Procedure Xuat; 
Var tepra:text; L,i:word; 
Begin 
Assign(tepra,fo); rewrite(tepra); 
L:=length(s); 
Writeln(tepra, L-1); 
For i:=1 to L do Writeln(tepra, s[i]); 
Close(tepra); 
End; 
Begin {Main Prog.} 
clrscr; 
Nhap; 
Facto; 
Sinh; 
Tim; 
Xuat; 
Writeln('Done!'); 
readln; 
End. 
B/ CÁC THUẬT TOÁN TÌM CÁC MIỀN LIÊN THÔNG TRÊN ĐỒ THỊ 
B.1) TÌM MIỀN LIÊN THÔNG TRÊN ĐỒ THỊ VÔ HƯỚNG 
3- Cài đặt thuật toán tìm & liệt kê các thành phần (miền) liên thông của một đồ thị vô hướng. Biết rằng cấu 
trúc của đồ thị vô hướng được biểu diễn bởi danh sách liệt kê cạnh như sau (Ds này lưu trên Text File 
LTHG.IN): 
13 10 
1 2 
1 3 
2 3 
4 5 
4 7 
5 6 
8 9 
10 12 
11 12 
12 13 
Kết quả lưu trên file Xuat.kq 
CODE: Để đạt được mục tiêu đề bài ta duyệt đồ thị Đệ quy theo DFS 
 8 h 54 m 28/7/2017 
150 Thầy Trần Thông Quế 
Program Dem_so_thp_lthong; 
uses crt; 
const max=50; 
fi='lthg.in'; fo='xuat.kq'; {Du lieu vao la Ds liet ke canh!} 
type m1=Array[0..max] of integer; 
m2=Array[1..max,1..max] of byte; 
var a:m2; {ma tran danh sach liet ke canh} 
n:integer; 
v:m1; 
sm:integer; {so mien lien thong} 
Procedure Nhap; 
var f:text; i,j:integer; 
Begin 
Assign(f,fi); Reset(f); 
Read(f,n); 
FillChar(a,sizeof(a),0); {khoi tri cho mang a} 
While not seekeof(f) do {tao ma tran luu dinh dau va cuoi cua moi canh} 
Begin 
Read(f,i); 
While not seekeoln(f) do 
Begin 
Read(f,j); 
a[i,j]:=1; 
a[j,i]:=1; 
End; 
Readln(f); 
End; 
Close(f); 
End; 
Procedure DFS(i:integer); 
Var j:integer; 
Begin 
For j:=1 to n do 
If v[j]=0 then {neu j chua thuoc mien lien thong nao thi} 
If a[i,j]=1 then {neu j ke voi i thi } 
Begin 
v[j]:=sm; {ghi nho dinh j cung mien lth sm voi i} 
DFS(j); {duyet tiep do thi theo chieu sau tu dinh j} 
End; 
End; 
Procedure Xuly; 
Var s:integer; 
Begin 
FillChar(v,sizeof(v),0); 
sm:=0; 
For s:=1 to n do 
 8 h 54 m 28/7/2017 
151 Thầy Trần Thông Quế 
If v[s]=0 then 
Begin 
Inc(sm); {danh so cho mien lth moi} 
v[s]:=sm; {s la dinh dau tien phat hien thuoc mien lth moi} 
DFS(s); {Duyet dthi tim tat ca cac dinh lth voi s} 
End; 
End; 
Procedure ghikq; 
var f:text; i,j:integer; 
Begin 
Assign(f,fo); Rewrite(f); 
Writeln(f,'So mien lien thong la:',sm); 
For i:=1 to sm do 
Begin 
For j:=1 to n do 
If v[j]=i then 
Write(f,j,' '); 
Writeln(f,'<-- Day la cac dinh o mien Lt thu ',i); 
End; 
close(f); 
End; 
Procedure Inkq; 
var f:text; line:string[50]; 
Begin 
Assign(f,fo); Reset(f); 
While not seekeof(f) Do 
Begin 
Readln(f,line); 
Writeln(line); 
End; 
Close(f); 
End; 
Begin clrscr; 
Nhap; 
Xuly; 
Ghikq; 
Inkq; 
Writeln; 
Write('Go ENTER de thoat!'); 
Readln; 
End. 
 8 h 54 m 28/7/2017 
152 Thầy Trần Thông Quế 
B.2) TÌM MIỀN LIÊN THÔNG MẠNH TRÊN ĐỒ THỊ CÓ HƯỚNG (THỰC 
CHẤT LÀ CÀI ĐẶT THUẬT TOÁN TARJAN) 
4/ Cài đặt thuật toán tìm & liệt kê các miền liên thông MẠNH của đồ thị có hướng (thuật toán TARJAN). 
Biết rằng đồ thị có hướng này được biểu diễn bởi ds cung sau đây (và ds này lưu trên text file 
LTH_MANH.IN): 
11 15 
1 2 
1 8 
2 3 
3 4 
4 2 
4 5 
5 6 
6 7 
7 5 
8 9 
9 4 
9 10 
10 8 
10 11 
11 9 
Kết quả lưu trên file LTH_MAMH.OU 
CODE: (Về duyệt đồ thị, bài này cũng dùng DFS) 
Program Tarjan_Alg; 
Uses crt; 
Const fi='LTH_MANH.IN'; fo='LTH_MANH.OU'; 
Type lk=^nut; 
nut=record 
s:word; 
next:lk; 
End; 
cay=array[0..200] of lk; 
m1=array[0..200] of word; 
Var sv,id,m,n,top:word; {m:so dinh; n:so canh} 
Num,Low,p,s:m1; dsk:cay; 
f:Text; 
Procedure Nhap; 
Var i,u,v: word; t:lk; 
Begin 
Assign(f,fi); Reset(f); 
Readln(f,m,n); {doc so dinh m, so canh n tu tep vao cac bien nho m,n} 
For i:=1 to n Do 
Begin 
Readln(f,u,v); 
New(t); 
 8 h 54 m 28/7/2017 
153 Thầy Trần Thông Quế 
t^.s:=v; 
t^.next:=dsk[u]; 
dsk[u]:=t; 
End; 
Close(f); 
End; 
Function min(u,v:word):word; 
Begin 
If u<v Then min:=u Else min:=v; 
End; 
Procedure DFS(i:word); 
Var j:word; t:lk; 
Begin 
Inc(id); 
Num[i]:=id; 
Low[i]:=Num[i]; 
t:=dsk[i]; 
Inc(top); 
s[top]:=i; 
While Not (t=Nil) Do 
Begin 
j:=t^.s; 
If p[j]=0 then 
If Num[j]=0 then 
Begin 
DFS(j); 
Low[i]:=min(Low[i], Low[j]); 
End 
Else Low[i]:=min(Low[i], Num[j]); 
t:=t^.next; 
End; 
If Low[i]=Num[i] then 
Begin 
Inc(sv); 
Repeat 
j:=s[top]; {lay 1 phan tu ra khoi Stack tai dinh, luu vao j} 
dec(top); {Khi do so phan tu o Stack giam di mot} 
p[j]:=sv; 
Until i=j; 
End; 
End; 
Procedure Visit; 
var i:word; 
Begin 
For i:=1 to m do 
 8 h 54 m 28/7/2017 
154 Thầy Trần Thông Quế 
If Num[i]=0 then DFS(i); 
End; 
Procedure Xuat; 
Var i,j:word; 
Begin 
Assign(f,fo); Rewrite(f); 
Writeln;Writeln; 
Writeln(f,'So mien lien thong la:',sv); 
For i:=1 to sv Do 
Begin 
For j:=1 to m Do 
If p[j]=i then write(f,j,' '); 
Writeln(f,'-> Cac dinh thuoc mien lien thong thu ',i,'.'); 
End; 
Close(f); 
end; 
Procedure Inkq; 
Var f:Text;line:String; 
Begin 
Assign(f,fo); Reset(f); 
While Not SeekEof(f) Do 
Begin 
Readln(f,line); 
Writeln(line); 
End; 
Close(f); 
End; 
{ Main Program } 
Begin clrscr; 
Nhap; 
Visit; 
Xuat; 
Inkq; 
Readln; 
End. 
B.3) BÀI TOÁN TÔ MÀU ĐỒ THỊ 
5- Hãy dùng số màu ít nhất để tô màu đồ thị có N đỉnh, sao cho hai đỉnh BẤT KỲ KỀ NHAU phải được tô 
bằng màu KHÁC NHAU. 
Yêu cầu: 
1-Đồ họa hóa Code 
2-Cấu trúc đồ thị tự động thay đổi nhờ nhấn phím ENTER; nhấn ESC để thoát. 
CODE: 
PROGRAM COLOR_GRAPH; 
 8 h 54 m 28/7/2017 
155 Thầy Trần Thông Quế 
USES CRT,GRAPH; 
CONST R=15;DL=500;VC=100;N=8; 
C:ARRAY[1..8] OF INTEGER=(150,330,450,450,330,150,30,30); 
D:ARRAY[1..8] OF INTEGER=(30,30,150,330,450,450,330,150); 
CL:ARRAY[0..4] OF WORD=(WHITE,RED,YELLOW,BLUE,GREEN); 
TYPE CSD=0..VC; 
VAR G:ARRAY[CSD,CSD] OF BOOLEAN; 
V,V0,V1:SET OF CSD; 
I,J,K:CSD; 
(*------------------------------------------------------------*) 
PROCEDURE INITGR; 
VAR GD,GM:INTEGER; 
BEGIN 
GD:=DETECT; 
INITGRAPH(GD,GM,'..\BGI'); 
IF (GRAPHRESULT GROK) THEN 
BEGIN 
WRITELN('LOI KHOI TAO DO HOA, GO ENTER KET THUC !'); 
READLN; 
HALT(1) 
END 
END; 
(*-----------------------------------------------------*) 
PROCEDURE VENUT(U:CSD;M:WORD); 
BEGIN 
SETFILLSTYLE(1,M);SETCOLOR(M); 
FILLELLIPSE(C[U],D[U],R,R); 
END; 
(*-------------------------------*) 
PROCEDURE LINK(X,Y:CSD;M:WORD); 
BEGIN 
SETCOLOR(M); 
LINE(C[X],D[X],C[Y],D[Y]); 
END; 
(*-------------------------------*) 
PROCEDURE INIT_GRAPH; 
BEGIN 
RANDOMIZE; 
FOR I:=1 TO N DO 
BEGIN 
G[I,I]:=FALSE; 
FOR J:=I+1 TO N DO 
BEGIN 
G[I,J]:=RANDOM(3)=1; 
G[J,I]:=G[I,J] 
END; 
 8 h 54 m 28/7/2017 
156 Thầy Trần Thông Quế 
END; 
FOR I:=1 TO N DO 
BEGIN 
J:=0; 
REPEAT 
J:=J+1 
UNTIL G[I,J] OR (J=N); 
IF (J=N) AND (NOT G[I,N]) THEN 
BEGIN 
J:=RANDOM(N)+1; 
IF J=I THEN IF I<N THEN J:=I+1 ELSE J:=I-1; 
G[I,J]:=TRUE;G[J,I]:=TRUE 
END; 
END; 
END; 
(*--------------------------------------------------*) 
PROCEDURE MENU_PRINT; 
BEGIN 
SETCOLOR(WHITE); 
OUTTEXTXY(500,30,'Son Do Thi'); 
SETCOLOR(YELLOW); 
OUTTEXTXY(490,90,'Go Enter Tiep Tuc ...'); 
SETCOLOR(RED); 
OUTTEXTXY(490,150,'Go Esc Ket Thuc !'); 
END; 
(*--------------------------------------------------*) 
PROCEDURE PRINT_GRAPH; 
BEGIN 
SETBKCOLOR(BLUE);CLEARDEVICE; 
SETFILLSTYLE(1,DARKGRAY); 
BAR(0,0,GETMAXY,GETMAXY); 
FOR I:=1 TO N DO 
FOR J:=1 TO N DO IF G[I,J] THEN LINK(I,J,CL[0]); 
LINE(C[I],D[I],C[J],D[J]); 
FOR I:=1 TO N DO VENUT(I,CL[0]); 
END; 
(*--------------------------------------------------*) 
PROCEDURE COLORING; {To mau do thi} 
VAR CHECK:BOOLEAN; 
BEGIN 
V0:=V;K:=0; 
WHILE V0[] DO 
BEGIN 
K:=K+1; I:=0; 
REPEAT I:=I+1 UNTIL I IN V0; 
VENUT(I,CL[K]); DELAY(DL); 
 8 h 54 m 28/7/2017 
157 Thầy Trần Thông Quế 
V1:=[I]; 
FOR I:=1 TO N DO 
IF I IN V0 THEN 
BEGIN 
J:=0; 
REPEAT 
J:=J+1; 
CHECK:=G[I,J] AND (J IN V1); 
UNTIL CHECK OR (J=N); 
IF NOT CHECK THEN 
BEGIN 
VENUT(I,CL[K]); DELAY(DL); 
V1:=V1+[I]; 
END; 
END; 
V0:=V0-V1; 
END; 
END; 
(*---------------------------------------*) 
PROCEDURE PROC_CALL_PROC; {THU TUC GOI CAC THU TUC} 
VAR KT:CHAR; 
BEGIN 
IF KEYPRESSED THEN 
REPEAT KT:=READKEY UNTIL NOT KEYPRESSED; 
REPEAT 
INIT_GRAPH; 
PRINT_GRAPH; 
MENU_PRINT; 
COLORING; 
KT:=READKEY; 
UNTIL (KT=#27); 
END; 
(*--------------------------------------*) 
BEGIN (* CHUONG TRINH CHINH *) 
CLRSCR; 
INITGR; 
V:=[]; 
FOR I:=1 TO N DO V:=V+[I]; 
PROC_CALL_PROC; 
CLOSEGRAPH; 
END. 
 8 h 54 m 28/7/2017 
158 Thầy Trần Thông Quế 
VIII-2/ ĐỒ THỊ EULER & ĐỒ THỊ HAMILTON 
A) ĐỒ THỊ EULER 
6- Liệt kê các đường đi Euler trên đồ thị vô hướng được biểu diễn bởi ma trận kề dưới đây: 
9  Số đỉnh của đồ thị (Bắt buộc phải có dữ liệu này!) 
0 1 1 0 0 0 0 0 0 
1 0 1 0 0 0 0 0 0 
1 1 0 1 0 1 0 0 0 
0 0 1 0 1 0 0 0 0 
0 0 0 1 0 1 0 1 1 
0 0 1 0 1 0 1 1 0 
0 0 0 0 0 1 0 1 0 
0 0 0 0 1 1 1 0 1 
0 0 0 0 1 0 0 1 0 
CODE: 
Program Duongdi_Euler; 
uses crt; 
Label L1; 
Const max=30; 
Type mg1=array[1..max,1..max] of byte; 
mg2=array[1..max] of boolean; 
mg3=array[1..max] of integer; 
Var c:mg1; check:mg2; i,j,u,n,dem1,dem:integer; 
f:text; tf:string[12]; 
Function l_thg(u,v:integer; ktra:mg2):integer; 
var i,j,d,k,l:integer; p:mg3; 
Begin 
c[u,v]:=0; c[v,u]:=0; 
For i:=1 to n do p[i]:=0; 
d:=0; 
For i:=1 to n do 
Begin 
If (p[i]=0) and ktra[i] then 
Begin 
Inc(d); p[i]:=d; 
for j:=1 to n do 
for L:=1 to n do 
If (p[j]=0) and ktra[j] and (p[L]=d) and (c[L,j]=1) then 
p[j]:=d; 
End; 
End; 
c[u,v]:=1; c[v,u]:=1; 
L_thg:=d; 
End; 
 8 h 54 m 28/7/2017 
159 Thầy Trần Thông Quế 
{Main Prog.} 
Begin clrscr; 
Write('Nhap ten tep du lieu:'); readln(tf); 
Assign(f,tf); Reset(f); 
Readln(f,n); 
For i:=1 to n do 
For j:=1 to n do Read(f,c[i,j]); 
Close(f); 
Write('Cho biet dinh xuat phat:'); Readln(u); 
Writeln('Duong di Euler tim duoc:'); Writeln; 
dem:=0; 
For j:=1 to n do check[j]:=true; 
L1:dem1:=0; 
For j:=1 to n do 
If c[u,j]=1 then Inc(dem1); 
dem:=dem+1; 
If dem1=1 then 
Begin 
For j:=1 to n do If c[u,j]=1 then 
Begin 
check[u]:=false; 
c[u,j]:=0; c[j,u]:=0; 
Writeln('Di qua canh thu ',dem,' dung 1 lan la tu:',u,'->',j); 
u:=j; 
Goto L1; 
End; 
End 
Else 
Begin 
For j:=1 to n do 
If c[u,j]=1 then 
Begin 
If L_thg(u,j,check)=1 then 
Begin 
c[u,j]:=0; c[j,u]:=0; 
Writeln('Di qua canh thu ',dem,' dung 1 lan la tu:',u,'->',j); 
u:=j; 
Goto L1; 
End 
End 
End; 
Readln; 
End. 
7- Tìm và hiển thị chu trình EULER trên đồ thị biểu diễn bởi danh sách liệt kê cạnh. Yêu cầu: Program phải 
chạy được cả với đồ thị vô hướng và đồ thị có hướng (đồ thị vô hướng: gõ 0; đồ thị có hướng: gõ 1). 
Test1: Dùng file vào DTEUL.IN 
 8 h 54 m 28/7/2017 
160 Thầy Trần Thông Quế 
4 5 -> 4 đỉnh; 5 cạnh (Bắt buộc phải có hai data này!) 
1 2 
1 4 
2 3 
2 4 
3 4 
Test 2: Dùng file vào EU1.IN 
5 6 
1 2 
1 5 
2 5 
3 4 
3 5 
4 5 
B) ĐỒ THỊ HAMILTON 
8- Tìm và hiển thị đường đi Hamilton trên đồ thị vô hướng được biểu diễn bởi danh sách liệt kê cạnh. 
Test1: Dùng file vào DTEUL.IN 
4 5 
1 2 
1 4 
2 3 
2 4 
3 4 
Test 2: Dùng file vào EU1.IN 
5 6 
1 2 
1 5 
2 5 
3 4 
3 5 
4 5 
9/ (Bài này bạn thử test với ma trận kề của đồ thị) Tìm và liệt kê chu trình Hamilton trên đồ thị được biểu 
diễn bởi ma trận kề dưới đây. 
8 
0 1 1 1 0 0 0 0 
1 0 0 0 1 0 0 0 
1 0 0 1 1 0 0 0 
1 0 1 0 0 1 1 0 
0 1 1 0 0 1 0 1 
0 0 0 1 1 0 1 0 
0 0 0 1 0 1 0 1 
0 0 0 0 1 0 1 0 
 8 h 54 m 28/7/2017 
161 Thầy Trần Thông Quế 
CODE: 
Program Chutrinh_Hamilton; 
Uses crt; 
Var i,j,n:Integer; 
c:Array[1..20,1..20] of byte; 
p:Array[1..20] of byte; 
b:array[1..20] of boolean; 
d:Word; f1,f2:Text; 
Procedure Xuly; 
Label l1; 
Var t:integer; ktra:boolean; 
Begin 
ktra:=true; 
For t:=1 to n-1 Do 
If c[p[t],p[t+1]]=0 then 
Begin 
ktra:=False; 
goto L1; 
End; 
If c[p[n],p[1]]=0 then ktra:=False; 
L1:If ktra then 
Begin 
d:=d+1; 
Write(f2,'Chu trinh Hamilton thu ',d,' la:'); 
For t:=1 to n Do Write(f2,p[t]:3); 
Writeln(f2); 
End; 
End; 
Procedure test(k:integer); 
Var i1,j:integer; 
Begin 
For j:=1 to n do 
If b[j] then 
Begin 
p[k]:=j; b[j]:=False; 
If k=n then xuly Else test(k+1); 
b[j]:=True; 
End; 
End; 
{Main Prog.} 
Begin clrscr; 
Assign(f1,'CtHamil.Inp'); Reset(f1); 
Assign(f2,'CtHamil.Out'); Rewrite(f2); 
Readln(f1,n); 
For i:=1 to n do 
For j:=1 to n do Read(f1,c[i,j]); 
 8 h 54 m 28/7/2017 
162 Thầy Trần Thông Quế 
Close(f1); 
For i:=1 to n do b[i]:=True; d:=0; 
Test(1); 
Close(f2); 
Writeln('DONE!'); 
Writeln('Go Enter de quay ve chuong trinh!'); 
Writeln('De xem ket qua, go phi
            Các file đính kèm theo tài liệu này:
 nhungbaitappascal_5189.pdf nhungbaitappascal_5189.pdf