Phúc Chương 05t2

You might also like

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

Đồ án cấu trúc dữ liệu và thuật toán

BÁO CÁO ĐỒ ÁN
CẤU TRÚC DỮ LIỆU VÀ THUẬT TOÁN

I. Giới Thiệu:
Môn học CẤU TRÚC DỮ LIỆU VÀ THUẬT TOÁN được xem là
môn đóng vai trò nền tảng cơ bản đối với những ai bắt đầu bước vào thế
giới lập trình.
Để đi sâu vào môn học này chúng em nhận đề tài: “Ma Trận Latinh”
được viết bằng ngôn ngữ C và sử dụng thuật toán:”đệ quy quay lui”.

I.1 Nội dung đề tài:


“Ma trận NxN gọi là Latinh nếu các phần tử của nó được đánh số
từ 1 đến N sao cho mỗi hàng và mỗi cột của nó đều là các hoán vị của các
số 1, 2, ...N. Lập thuật toán xây dựng các ma trận Latinh.”

I.2 Thuật toán quay lui:


Nguyên lý chung :
Thuật toán liệt kê tất cả cấu hình S gồm k phần tử. S= s1 s2…sk giả
sử đã có cấu hình con s1 s2…si-1, ở bước thử tìm giá trị cho si, duyệt qua với
mọi giá trị j đề cử được cho si và thực hiện:
Bước 1: Gán j cho si;
Bước 2: Thay đổi trạng thái nếu có ;
Bước 3: Nếu đủ cấu hình (i==k) thì xuất(s) ; ngược lại thử cho
si+1 ;
Bước 4: Trả lại trạng thái cũ nếu có thay đổi.
Chương trình chính gọi thử cho s1;

I.3 Mô tả chương trình:


I.3.1 Cấu trúc dữ liệu:
Để thực hiện được chương trình cần:
- Mảng A[1..n][0..n-1][0..n-1] để đánh dấu phần tử được
chọn
- Mảng X[0…n*n-1] lưu trữ giá trị của ma trận tìm được
I.3.2 Nguyên lý:
Để đánh dấu phần tử đã tồn tại trong hàng i cột j ta dùng mảng 3
chiều với chiều thứ 1 chứa giá trị của ma trận latinh, chiều thứ 2 và 3 xem
như là hàng và cột của ma trận dùng để đánh dấu giá trị đã tồn tại trong
hàng và cột đó.

SVTH: Lê Hồng Phúc – Huỳnh Duy Chương Lớp 05T2 1


Đồ án cấu trúc dữ liệu và thuật toán

Ví dụ: giá trị 1 đặt tại hàng 0 cột 0 thì ta đánh dấu:

A[1][11…1]
[10…0]

[10…0]
Khởi đầu: i=0

J=1: A[1][hàng0][cột0]= 0 gán X[0]=1

Đánh dấu
A[1][11…1]
[10…0]

[10…0]

Gọi Thử(i+1)
Khi đó: i=1
- j=1 A[1][hàng0][cột1]=1
- j=2 A[2][hàng0][cột1]=0 đặt x[1]=2. Đánh dấu:

A[2][11…1]
[01…0]

[01…0]
Gọi Thử(i+1)
Khi đó i=2
- j=1 A[1][hàng0][cột2]=1
- j=2 A[2][hàng0][cột2]=1
- j=3 A[3][hàng0][cột2]=0 đặt x[2]=4. Đánh dấu:

A[3][111…1]
[001…0]

[001…0]

Như vậy cứ tiếp tục quá trình trên ta được ma trận Lalinh cần tìm.
Đối với ma trận đầu tiên: Kết quả của
i=n-1 lần gọi thử ta được mảng 1 chiều : x0=1,x1=2,…,xi=n-
1=n

SVTH: Lê Hồng Phúc – Huỳnh Duy Chương Lớp 05T2 2


Đồ án cấu trúc dữ liệu và thuật toán

i=n lần gọi thử ta được mảng 1 chiều :xn=2


....

I.3.3 Khai báo các hàm:


Để thực hiện các chức năng trên thì cần phải khai báo các hàm:
nhập, xuất, Try(). Ngoài ra để chương trình thêm mềm mại khai báo thêm
các hàm xử lý đồ họa:
1. Hàm nhập
Nhập giá trị đầu vào N trong môi trường đồ họa
2. Hàm xuất:
Xuất giá trị các phần tử của Ma trận Latinh ra môi trường đồ họa
khi đủ cấu hình cần thiết.
3. Hàm Try()
Dùng để duyệt tất cả các cấu hình nếu có. Nếu đủ cấu hình thì
gọi hàm xuất ngược lại duyệt cấu hình tiếp.

II. Thuật Toán:

SVTH: Lê Hồng Phúc – Huỳnh Duy Chương Lớp 05T2 3


Đồ án cấu trúc dữ liệu và thuật toán

BẮT ĐẦU

Nhập n
A[1..n][0..n-1][0..n-1]=0
Try(I)
X[0..n*n-1]=0
I=0

j=1

Sai
A[j][i/n][i%n]==0

Đúng

X[i]=j
A[j][i/n][0..n-1]=1
A[j][0..n-1][i%n]=1

In kết quả Đúng Sai


I==n*n-1

A[j][i/n][0..n-1]=0 Try(i+1)
A[j][0..n-1][i%n]=0

Đúng A[j][t/n][0..n-1]=1
Với mỗi X[t<i]==j A[j][0..n-1][t%n]=1

Sai

Đúng
While(j<=n)
N)

Sai

THOÁT

SVTH: Lê Hồng Phúc – Huỳnh Duy Chương Lớp 05T2 4


Đồ án cấu trúc dữ liệu và thuật toán

III. Chương Trình:

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<graphics.h>
#include<dos.h>
#include<string.h>
#define size 10
int t,n,wd=40;
unsigned long slan;
int a[size][size][size],x[size*size];
void Screen();
void dat_gt(int x,int y);
void Try(int i);
void Quaylui(int i);
void mh_chao();
void nhap_n();
void Hien_kq();
void sukien();
void Exit(void);
void main()
{ t=300;
int driver=DETECT,mode,mh;
initgraph(&driver,&mode,"c:\\tc\\bgi") ;
Screen();
Try(0);
setviewport(1,1,getmaxx(),getmaxy(),0);
settextstyle(0,0,2);
outtextxy(250,350,"Da lam xong!!!") ;
getch();
closegraph();
}
/*----------------------------------------------------------------------*/
void sukien()
{ char ch;
ch=getch();
setcolor(13);
settextstyle(0,0,1);
switch(ch)
{ case 27:
outtextxy(20,n*wd+20,"Ban that su muon thoat: Y - N?");

SVTH: Lê Hồng Phúc – Huỳnh Duy Chương Lớp 05T2 5


Đồ án cấu trúc dữ liệu và thuật toán

ttt:
ch=getch();
if((ch=='y')||(ch=='Y')){closegraph(); exit(1);}
else if((ch=='N')||(ch=='n'))
{ setfillstyle(1,0);
bar(20,n*wd+20,400,n*wd+40) ;
goto tt;
}
else goto ttt;
break;
case 'N','n': t=0; break;
tt:
default :t=300;
}
}
/*----------------------------------------------------------------------*/
void mh_chao()
{
int i,j;
setviewport(1,1,getmaxx(),getmaxy(),0);
setcolor(YELLOW);
setbkcolor(0);
settextstyle(10,0,1);
setcolor(LIGHTGREEN);
outtextxy(120,10,"DO AN CAU TRUC DU LIEU") ;
settextstyle(0,0,2);
outtextxy(75,60,"CHUONG TRINH TAO MA TRAN LA
TINH") ;
settextstyle(3,0,2);
outtextxy(220,250,"GVHD: PHAN CHI TUNG") ;
outtextxy(220,300,"SVTH: LE HONG PHUC - 05T2") ;
outtextxy(278,350," HUYNH DUY CHUONG - 05T2") ;

}
/*----------------------------------------------------------------------*/
void nhap_n()
{ char *s,ch,ch1;
setviewport(1,1,getmaxx(),getmaxy(),0);
setcolor(YELLOW);
tt:
outtextxy(0,0,"Nhap Gia Tri Cua n:") ;
ch=getch();
if(ch==8)

SVTH: Lê Hồng Phúc – Huỳnh Duy Chương Lớp 05T2 6


Đồ án cấu trúc dữ liệu và thuật toán

{ tt1:
setfillstyle(1,0);
bar(215,0,250,40);
goto tt;
}
if((ch<49)||(ch>59))goto tt;
setfillstyle(1,0);
bar(215,0,250,40);
{
s[0]=ch; s[1]=NULL;
n=ch-48;
outtextxy(220,0,s);
}
ch=getch();
if(ch==8) goto tt1;
if(ch!=13)
{
outtextxy(0,50," 1 <= N <= 9");’
setfillstyle(1,0);
bar(215,0,250,40);
goto tt;
}
cleardevice();
}
/*----------------------------------------------------------------------*/
void Screen()
{
int i,j,left,top,bottom,right,midx,midy;
cleardevice();
mh_chao();
getch();
cleardevice();
nhap_n();
midx=getmaxx()/2;
midy=getmaxy()/2;
left=midx-n*20;
right=midx+n;
bottom=midy+n;
top=midy-n*20;
setcolor(RED);
settextstyle(3,0,1);
setviewport(1,1,getmaxx(),getmaxy(),0);
outtextxy(0,n*wd+19*2,"MT:");

SVTH: Lê Hồng Phúc – Huỳnh Duy Chương Lớp 05T2 7


Đồ án cấu trúc dữ liệu và thuật toán

settextstyle(0,0,1);
outtextxy(0,n*wd+21*3,"ESC - Thoat");
outtextxy(0,n*wd+20*4,"N - Lam Nhanh");
outtextxy(0,n*wd+20*5,"Phim khac lam tung buoc");
setcolor(YELLOW);
settextstyle(0,0,2);
outtextxy(midx-100,10,"MA TRAN LA TINH");
setviewport(left,top,right,bottom,0);
setfillstyle(1,7);
bar(0,0,n*wd,n*wd);
setcolor(YELLOW);
setlinestyle(SOLID_LINE,1,2) ;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
rectangle(i*wd,j*wd,i*wd+wd,j*wd+wd);
}
/*----------------------------------------------------------------------*/
void Hien_kq()
{
slan++;
int left,top,bottom,right,midx,midy;
midx=getmaxx()/2;
midy=getmaxy()/2;
left=midx-n*20;
right=midx+n;
bottom=midy+n;
top=midy-n*20;
setviewport(1,1,getmaxx(),getmaxy(),0);
char *s;
setfillstyle(1,0);
bar(30,n*wd+40,100,n*wd+60);;
setcolor(RED);
settextstyle(1,0,1);
sprintf(s,"%3u",slan);
outtextxy(30,n*wd+19*2,s);
setviewport(left,top,right,bottom,0);
sukien();
}
/*----------------------------------------------------------------------*/
void dat_gt(int x,int y)
{
if(kbhit()) sukien();
delay(t);

SVTH: Lê Hồng Phúc – Huỳnh Duy Chương Lớp 05T2 8


Đồ án cấu trúc dữ liệu và thuật toán

char *gt;
int x1;
x1=y%n;
setcolor(10);
settextstyle(3,0,4);
sprintf(gt,"%d",x);
outtextxy(x1*wd+10,(y/n)*wd+3,gt);
}
/*----------------------------------------------------------------------*/
void Quaylui(int i)
{ int k,j;
if(kbhit()) sukien();
j=i%n;
k=i/n;
delay(t);
setfillstyle(1,7);
bar(j*wd,k*wd,j*wd+wd,k*wd+wd);
setcolor(YELLOW);
setlinestyle(SOLID_LINE,0,2);
rectangle(j*wd,k*wd,j*wd+wd,k*wd+wd);
}
/*----------------------------------------------------------------------*/
void Try(int i)
{int j,k,t;
for(j=1;j<=n;j++)
{if(a[j][i/n][i%n]==0)
{x[i]=j;
dat_gt(x[i],i);
for(k=0;k<n;k++)
{ a[j][i/n][k]=1;
a[j][k][i%n]=1;
}
if(i==n*n-1) Hien_kq();
else Try(i+1);
for(k=0;k<n;k++)
{a[j][i/n][k]=0;
a[j][k][i%n]=0;
}

for(t=0;t<i;t++)
{if(x[t]==j)
for(k=0;k<n;k++)
{a[j][t/n][k]=1;

SVTH: Lê Hồng Phúc – Huỳnh Duy Chương Lớp 05T2 9


Đồ án cấu trúc dữ liệu và thuật toán

a[j][k][t%n]=1;
}
}
Quaylui(i);
}
}
}

IV. Kết Quả Chương Trình:

Nhập N=9
Kết quả xuất Ma trận đầu tiên:

SVTH: Lê Hồng Phúc – Huỳnh Duy Chương Lớp 05T2 10


Đồ án cấu trúc dữ liệu và thuật toán

V.Kết luận
- Ưu điểm:
Chương trình xử lý chính xác, kết quả hiển thị rõ ràng Ma trận
Latinh lên màn hình. Bài toán đã được giải quyết
- Nhược điểm:
Chương trình không xử lý được giá trị n>9 vì với n>9 số lần gọi
hàm lớn hay nói cách khác công việc tính toán khá lớn và khó mô
tả được trên màn hình một cách đầy đủ.

SVTH: Lê Hồng Phúc – Huỳnh Duy Chương Lớp 05T2 11

You might also like