Professional Documents
Culture Documents
Phúc Chương 05t2
Phúc Chương 05t2
Phúc Chương 05t2
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”.
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
Đá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
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
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
#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?");
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)
{ 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:");
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);
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;
a[j][k][t%n]=1;
}
}
Quaylui(i);
}
}
}
Nhập N=9
Kết quả xuất Ma trận đầu tiê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 đủ.