Tải bản đầy đủ (.doc) (20 trang)

Trên bàn cờ ô vuông MxN các ô được đánh dấu 0 là các ô tự do, các ô được đánh dấu 1 là các ô có mìn. Tìm đường đi ngắn nhất giữa 2 điểm tự do A, B cho trước của “Mê cung

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (281.6 KB, 20 trang )

sinh viên: Hồ Thanh Phong Lớp: 06T4
LỜI MỞ ĐẦU
Như chúng ta đã biết, để thực hiện bất kì một dự án phần mềm nào cũng được
bắt đầu từ “thuật toán” và tổ chức “dữ liệu”. Chính vì vậy, môn Cấu trúc dữ liệu và
giải thuật được coi là môn học đóng vai trò nền tảng cơ bản đối với những ai bước vào
thế giới lập trình. Nó là cơ sở vững chắc để ta có thể giải quyết các bài toán trong quá
trình học tập cũng như lúc làm việc. Nó cung cấp cho chúng ta những hiểu biết các
giải thuật tác động lên dữ liệu cũng như cách tổ chức dữ liệu để giải quyết bài toán
theo hướng dễ nhất, nhanh nhất, tối ưu nhất.
Sau khi học xong môn Cấu trúc dữ liệu và giải thuật, sinh viên được giao cho
một đề tài để làm đồ án môn học. Đây là đề tài của em:
Đề tài: (đề số 33)
Trên bàn cờ ô vuông MxN các ô được đánh dấu 0 là các ô tự do, các ô được
đánh dấu 1 là các ô có mìn. Tìm đường đi ngắn nhất giữa 2 điểm tự do A, B cho
trước của “Mê cung”.
Đà Nẵng, tháng 12 năm 2009.

Sinh viên thực hiện:
Hồ Thanh Phong
Lớp: 06T4 – Khoa CNTT
2
sinh viên: Hồ Thanh Phong Lớp: 06T4
PHẦN I : TỔ CHỨC DỮ LIỆU VÀ GIẢI THUẬT
I. Phân tích bài toán
Căn cứ dữ liệu vào và yêu cầu bài toán là tìm đường đi ngắn nhất giữa 2 điểm tự
do A , B cho trước nên ta sẻ bắt đầu từ điểm xuất phát và lần theo các điểm 0 để đến
được điểm kết thúc. Nếu không có điểm 0 tiếp mà toàn điểm 1 hoặc bắt đầu xuất phát
từ vị trí 1 thì sẻ không có đường đi từ A đến B.
II. Tổ chức dữ liệu
 Đầu tiên ta tạo file “BFS.INP” để nhập dữ liệu vào cho bài toán . file này chứa
mảng vào A. Cấu tạo file gồm :


• Dòng đầu : (m,n) độ lớn của mê cung hay mảng A
• Dòng tiếp là tọa độ điểm xuất phát .
• Dòng tiếp là tọa độ điểm kết thúc .
• Các dòng tiếp theo là các giá trị A[i][j].
 Hai mảng kiểu nguyên : hx[4]={0,1,0,-1}; hy[4]={1,0,-1,0}
để kiểm tra 4 vị trí xung quanh điểm cần xét xem là điểm 0 hay 1.
 Một cấu trúc kiểu tọa độ.
struct toado
{
int d;
int c;
};
Để lưu tọa độ dòng cột ,của các phần tử.
 Giá trị MAX =100 để gán giá trị tối đa cho mảng.
 Một hàng đợi Queue[MAX] kiểu tọa độ để chứa tọa độ các phần tử sẽ được
duyệt theo chiều rộng .
 Mảng 1 chiều pre[MAX] kiểu tọa độ để lưu vết đường đi , và mảng DD[MAX]
kiểu tọa độ để lưu đường đi .
 S,E là 2 tọa độ bắt đầu và kết thúc nhập vào ở file.
 Mảng 2 chiều: A[MAX][MAX] kiểu nguyên để lưu ma trận vào, và
check[MAX][MAX] kiểu nguyên để đánh dấu các đỉnh đã đi qua.
 Hai biến front, rear là 2 biến trước và sau .
III. Mô tả thuật toán
Bài toán trên có nhiều cách giải quyết nhưng có thể nói rằng thuật toán tìm kiếm
theo chiều rộng ( Breadth-first search, viết tắt là BFS ) là một trong những cách giải
tối ưu. Tìm kiếm ưu tiên chiều rộng , hay còn gọi là “loang”, là một trong những thuật
toán duyệt đồ thị đơn giản nhất. Ý tưởng của nó được sử dụng trong nhiều thuật toán,
chẳng hạn thuật toán Prim tìm cây khung nhỏ nhất, thuật toán Dijkstra tìm đường đi
ngắn nhất,
Loang chủ yếu được sử dụng để tìm đường đi ngắn nhất theo số cạnh giữa hai

đỉnh của một đồ thị. Ta hình dung từ một đỉnh nguồn s, ban đầu thuật toán loang khám
phá các đỉnh đến được từ s, đó là lớp thứ nhất, sau đó lại khám phá các đỉnh chưa thăm
3
sinh viên: Hồ Thanh Phong Lớp: 06T4
và đến được từ lớp thứ nhất, đó là lớp thứ hai, v.v Nghĩa là các đỉnh đến từ có
khoảng cách k từ s luôn được khám phá trước các đỉnh có khoảng cách k+1 từ s.
 Thuật toán tìm kiếm theo chiều rộng (Breath First Search)
1. Cài đặt hàng đợi
Cơ sở của phương pháp này là “lập lịch” duyệt các đỉnh. Việc thăm 1 đỉnh sẽ
lên lịch duyệt các đỉnh kề nó sao cho thứ tự duyệt là ưu tiên chuyển động (đỉnh nào
gần S hơn sẽ được duyệt trước). Ví dụ bắt đầu ta thăm đỉnh S . Việc thăm đỉnh S sẻ
phát sinh thứ tự duyệt những đỉnh (x1,x2, ,xp) kề với S (những đỉnh gần S nhất ). Khi
thăm đỉnh x1 lại phát sinh yêu cầu duyệt đỉnh (u1,u2, ,uq) kề với x1. Nhưng rỏ ràng
các đỉnh u này “xa” S hơn những đỉnh x nên chúng chỉ được duyệt khi tất cả những
đỉnh x đả duyệt xong. Tức là thứ tự duyệt đỉnh sau khi thăm x1 sẽ là
(x2,x3, ,xp,u1,u2, ,uq).

x
p
x
1
x
2
u
p
u
1
u
2
… Phải duyệt sau x

p
Giả sử ta có một danh sách chứa những đỉnh đang chờ thăm. Tại mỗi bước, ta
thăm một đỉnh đầu danh sách và cho những đỉnh chưa sắp hàng kề với nó xếp hàng
thêm vào cuối danh sách. Chính vì nguyên tắc đó nên danh sách chứa những đỉnh đang
chờ sẽ được tổ chức dưới dạng hàng đợi (Queue).
2. Mô hình của giải thuật có thể được viết như sau:
Bước 1: Khởi tạo:
Các đỉnh đều ở trạng thái chưa đánh dấu, ngoại trừ đỉnh xuất phát S đã được
đánh dấu. Một hàng đợi (Queue), ban đầu chỉ có một phần tử là S. Hàng đợi dùng để
chứa các đỉnh sẽ được duyệt theo thứ tự ưu tiên chiều rộng.
Bước 2: Lặp các bước sau đến khi hàng đợi rỗng:
Lấy u ra khỏi hàng đợi, thông báo thăm u (bắt đầu duyệt đỉnh u).
Xét tất cả các đỉnh v kề với u mà chưa được dánh dấu, với mỗi đỉnh v đó: đánh
dấu v. Ghi nhận vết đường đi từ u tới v (có thể làm chung với việc đánh dấu). Đẩy v
vào hàng đợi (v sẽ được duyệt tại các bước sau).
4
S
S
sinh viên: Hồ Thanh Phong Lớp: 06T4
Bước 3: Truy vết tìm đường đi.
IV. Giải thuật cho bài toán :
Giải thuật cho chương trình được thiết kế như sau:
Định nghĩa file vào và file xuất:
#define filein "BFS.INP"
#define fileout "BFS.OUT"
Đầu tiên ta gán các giá trị trong mảng kiểm tra check đều bằng 0 tức là chưa có
điểm nào được đánh dấu.
for (i=0;i<m;i++)
for (j=0;j<n;j++)
check[i][j]=0;

Và đưa điểm bắt đầu vào hàng đợi Queue
queue[1].d=S.d;
queue[1].c=S.c;
Sau đó tiến hành tìm kiếm theo chiều rộng:
void BFS(void)
{ int x,y,i;
do
{
front=front+1; //tăng biến front lên 1
x=queue[front].d;y=queue[front].c; //để lưu lại vết đưa vào mảng pre
for(i=0;i<=3;i++)
if ((a[x+hx[i]][y+hy[i]]==0)&&(x+hx[i]>=0)&&
(x+hx[i]<=m-1)&&(y+hy[i]>=0)&&(y+hy[i]<=n-1)
&& (check[x+hx[i]][y+hy[i]]==0))
/* kiểm tra 4 điểm bao quanh xem có thỏa mản là bằng 0 và các điểm đó có
vượt ra khỏi giới hạn của ma trận không. */
{ //nếu thỏa mản các điều kiện trên thì:
rear=rear+1; //tăng rear lên 1;
check[x][y]=1; //gán lại phần tử đó trong mảng check bằng 1
queue[rear].d=x+hx[i]; // đưa các phần tử tiếp theo vào hàng đợi
queue[rear].c=y+hy[i];
pre[rear].d=x; // lưu lại vết vào mảng pre
pre[rear].c=y;
}
}
while (front<=rear);
/* tìm đến khi nào front<=rear thì thoát khỏi hàm và kết thúc việc tìm kiếm theo chiều
rộng.*/
}
//Sau đó ta tiến hành truy vết ngược trở lại để tìm đường đi ngắn nhất.

int truyvet(toado E)
{
int i,j,k,d1;
i=rear; //vị trí cuối của hàng đợi sau khi tìm kiếm theo chiều rộng.
5
sinh viên: Hồ Thanh Phong Lớp: 06T4
while ((i>0) && ((E.d != queue[i].d)||(E.c != queue[i].c)))
i ;
// giảm i trong khi phần tử kết thúc không có trong hàng đợi
if ((i<=0)|| (a[S.d][S.c]==1))
return -1;
/* Nếu đến cuối hàng đợi mà vẩn không có phần tử kết thúc hoặc phần tử xuất
phát tại vị trí 1 tức tại điểm có mìn thì sẽ không có đường đi từ S đến E và trả giá trị
của hàm về -1. */
else
{
d1=i; // vị trí có phần tử kết thúc.
j=1; //đếm số phần tử trong mảng đường đi DD
DD[j]=pre[d1]; // ngược lại thì có phần tử kết thúc trong hàng đợi nên ta đưa
phần tử ở mảng truy vết pre vào mảng đường đi DD.
while ((pre[d1].d!=S.d) ||(pre[d1].c!=S.c))
// trong khi phần tử tiếp theo còn khác điểm xuất phát thì :
{ for(k=d1-1;k>=1;k )
/* ta kiểm tra 4 phần tử xung quanh phần tử mới đưa vào DD nếu có trong mảng pre
thì đưa tiếp vào DD.*/
{
for(i=0;i<=3;i++)
if((pre[d1].d+hx[i]==pre[k].d)&&(pre[d1].c+hy[i]==pre[k].c))
{
d1=k;

j++ ; //tăng tiếp số phần tử trong DD lên
DD[j]=pre[d1]; //thêm phần tử thỏa mãn vào DD
}
}
}
return j; // trả về số phần tử trong mảng DD
}
}
Độ phức tạp:
Độ phức tạp của thuật toán BFS là O(n).
6
sinh viên: Hồ Thanh Phong Lớp: 06T4
PHẦN II: CÀI ĐẶT CHƯƠNG TRÌNH
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include <stdlib.h>
#define max 100
#define filein "BFSIN.TXT"
#define fileout "BFSOUT.TXT"
int hx[4]={0,1,0,-1};
int hy[4]={1,0,-1,0} ;
struct toado
{
int d;
int c;
};
toado queue[max];
toado pre[max],DD[max];
toado S,E;

int check[max][max],a[max][max];
int front=0, rear=1;
int m,n;
/*======================================*/
//nhap du lieu tu file
void inputdata()
{ int i,j;
FILE *f;
7
sinh viên: Hồ Thanh Phong Lớp: 06T4
if ((f= fopen(filein,"r")) == NULL)
{ printf ("\n\tLoi ko mo dc file !(BFS.INP)\n");
FILE *f;
f=fopen(fileout,"w");
fprintf(f,"\n\tLoi ko mo dc file!(BFS.INP)\n");
getch();
exit(1);
}
else
{
while (!feof(f))
{
flushall();
fscanf(f,"%d%d",&m, &n);
fscanf(f,"%d%d",&S.d ,&S.c);
fscanf(f,"%d%d",&E.d ,&E.c);
printf("\n\tMa tran vao:\n");
for(i=0;i<m;i++)
{
printf("\n\t");

for(j=0;j<n;j++)
{
fscanf(f,"%d",&a[i][j]);
printf(" %d", a[i][j]);
}
}
}
8
sinh viên: Hồ Thanh Phong Lớp: 06T4
fclose(f);
for (i=0;i<m;i++)
for (j=0;j<n;j++)
check[i][j]=0; //gan cac phan tu trong mang kiem tra bang 0
queue[1].d=S.d; //dua diem bat dau vao hang doi
queue[1].c=S.c;
}
}
/*=============================*/
void BFS(void)
{
int x,y,i;
do
{
front=front+1;
x=queue[front].d;y=queue[front].c;
for(i=0;i<=3;i++)
if ((a[x+hx[i]][y+hy[i]]==0)&&(x+hx[i]>=0)&&
(x+hx[i]<=m-1)&&(y+hy[i]>=0)&&(y+hy[i]<=n-1)&&(check[x+hx[i]]
[y+hy[i]]==0))
{

rear=rear+1;
check[x][y]=1;
queue[rear].d=x+hx[i];
queue[rear].c=y+hy[i];
pre[rear].d=x;
pre[rear].c=y;
9
sinh viên: Hồ Thanh Phong Lớp: 06T4
}
}
while (front<=rear);
}
// //
int truyvet(toado E)
{
int i,j,k,d1;
i=rear;
while ((i>0) && ((E.d != queue[i].d)||(E.c != queue[i].c)))
i ;
if ((i<=0)|| (a[S.d][S.c]==1))
return -1;
else
{
d1=i;
j=1;
DD[j]=pre[d1];
while ((pre[d1].d!=S.d) ||(pre[d1].c!=S.c))
{
for(k=d1-1;k>=1;k )
{

for(i=0;i<=3;i++)
if((pre[d1].d+hx[i]==pre[k].d)&&(pre[d1].c+hy[i]==pre[k].c))
{
d1=k;
j++;
10
sinh viên: Hồ Thanh Phong Lớp: 06T4
DD[j]=pre[d1];
}
}
}
return j;
}
}
/*=================================*/
//ham xuat du lieu
void outputdata()
{ int i,j;
FILE *f;
f=fopen(fileout,"w");
i=truyvet(E);
if (i==-1)
{
fprintf(f,"\nKhong co duong di tu A[%d][%d] den A[%d][%d]",S.d,S.c,E.d,E.c);
printf("\n\tKhong co duong di tu A[%d][%d] den A[%d][%d]",S.d,S.c,E.d,E.c);
}
else
{
fprintf(f,"\t\t DAI HOC BACH KHOA DA NANG");
fprintf(f,"\n\t\t KHOA CONG NGHE THONG TIN\n");

fprintf(f,"\n\t\t DO AN CAU TRUC DU LIEU VA GIAI THUAT\n");
fprintf(f,"\n\t- Sinh vien thuc hien:\n");
fprintf(f,"\n\t\t+ Ho Thanh Phong");
fprintf(f,"\n\t- Lop:\t06T4\n");
11
sinh viên: Hồ Thanh Phong Lớp: 06T4
fprintf(f,"\n\tDuong di ngan nhat tu A[%d][%d] den A[%d][%d]:\n",S.d,S.c,E.d,E.c);
for(j=i;j>=1;j )
fprintf(f," \tA[%d][%d]\n",DD[j].d,DD[j].c);
fprintf(f," \tA[%d][%d]",E.d,E.c);
printf("\n\n\tDuong di ngan nhat tu A[%d][%d] denA[%d]
[%d]:\n\n",S.d,S.c,E.d,E.c);
for(j=i;j>=1;j )
printf(" A[%d][%d] ==>",DD[j].d,DD[j].c);
printf(" A[%d][%d]",E.d,E.c);
}
fclose(f);
}
//chuong trinh chinh
void main(void)
{
clrscr();
int n ;
char tt;
textbackground(GREEN);
textcolor(WHITE);
printf("\t\t\tDAI HOC BACH KHOA DA NANG");
printf("\n\t\t\tKHOA CONG NGHE THONG TIN\n");
printf("\n\t\t DO AN CAU TRUC DU LIEU VA GIAI THUAT\n");
printf("\n\tSinh vien thuc hien:\n");

printf("\n\t\t- Ho Thanh Phong");
printf("\n\tLop:\t06T4 - Nhom : 12A\n");
printf("\n \n");
12
sinh viên: Hồ Thanh Phong Lớp: 06T4
printf("\n * DU LIEU VAO : BFSIN - DU LIEU RA : BFSOUT \n");
printf("\n * Nhap 0 de xem huong dan nhap Ma Tran vao file : BFSIN\n ");
printf("\n * Nhap 1 so bat ky de xem xem ket qua \n");
printf("\n \n");
chon: printf("\n Ban chon (0/1) : ");
scanf ("%d" ,&n);
printf("\n \n");
switch (n)
{
case 0 : printf("\n\t CAU TRUC DU LIEU NHAP VAO TRONG FILE BFSIN \n\t");
printf("\n Sohang Socot \n");
printf("\n Toa do diem bat dau di \n");
printf("\n Toa do diem ket thuc \n");
printf("\n Ma tran duong di giua cac diem \n");
printf("\n \n");
goto chon;
case 1 : printf("\n\t CAU TRUC DU LIEU NHAP VAO TRONG FILE BFSIN \n\t");
break;
default : printf("\n Chon lai nhe (0 | 1 )\n"); goto chon;
}
inputdata();
BFS();
outputdata();
printf("\n \n");
printf("\n * Co The Xem Ro Hon Ket Qua Trong file : BFSOUT.TXT \n");

getch();
}
13
sinh viên: Hồ Thanh Phong Lớp: 06T4
PHẦN III: KẾT QUẢ
Kết quả được xuất ra ở màn hình và file BFS.OUT
Hình 1 : Giao Diện Chương trình
Hình 2: Có đường đi từ S đến E của file vào BFSIN.TXT.
14
sinh viên: Hồ Thanh Phong Lớp: 06T4
Hình 3: Không tìm thấy file vào BFSIN.TXT
Hình 3: Không có đường đi từ S đến E
Hình 4: Không có đường đi từ S đến E
15
sinh viên: Hồ Thanh Phong Lớp: 06T4
PHẦN IV: KẾT LUẬN
Đạt được:
Sau khi hoàn thành chương trình và chạy thử , em thấy chương trình chạy ổn định ,
việc nhập xuất dữ liệu cũng chính xác và nhanh chóng .
Đây là một số thành công đạt được:
 Đồ án đã hoàn thành.
 Viêc nhập dữ liệu từ file em thấy rất tiện lợi và có nhiều ưu điểm hơn so với
nhập bằng tay , cụ thể là ta có thể nhập nhanh khi dữ liệu lớn và dễ sữa chữa dữ
liệu khi có sai sót mà không cần phải nhập lại từ đầu.
 Chương trình đã chạy cho kết quả đúng theo yêu cầu đề tài.
 Chương trình ngắn gọn, dễ hiểu, rõ ràng.
Thiếu sót:
Tuy đồ án đã hoàn thành nhưng không tránh được những thiếu sót. Em xin rút
ra những thiếu xót sau:
 Chương trình còn khá đơn giản

 Thiếu phần đồ họa trong C để tạo giao diên cho chương trình.
 Mới chỉ viết dưới 1 loại ngôn ngữ lập trình.
16
sinh viên: Hồ Thanh Phong Lớp: 06T4
MỤC LỤC
LỜI MỞ ĐẦU 2
PHẦN I : TỔ CHỨC DỮ LIỆU VÀ GIẢI THUẬT 3
I.Phân tích bài toán 3
II.Tổ chức dữ liệu 3
III.Mô tả thuật toán 3
1.Cài đặt hàng đợi 4
IV.Giải thuật cho bài toán : 5
PHẦN II: CÀI ĐẶT CHƯƠNG TRÌNH 7
#include<conio.h> 7
#include<stdio.h> 7
#include<stdlib.h> 7
#include <stdlib.h> 7
#define max 100 7
#define filein "BFSIN.TXT" 7
#define fileout "BFSOUT.TXT" 7
int hx[4]={0,1,0,-1}; 7
int hy[4]={1,0,-1,0} ; 7
struct toado 7
{ 7
int d; 7
int c; 7
}; 7
toado queue[max]; 7
toado pre[max],DD[max]; 7
toado S,E; 7

int check[max][max],a[max][max]; 7
int front=0, rear=1; 7
int m,n; 7
/*======================================*/ 7
//nhap du lieu tu file 7
void inputdata() 7
{ int i,j; 7
FILE *f; 7
if ((f= fopen(filein,"r")) == NULL) 8
{ printf ("\n\tLoi ko mo dc file !(BFS.INP)\n"); 8
FILE *f; 8
f=fopen(fileout,"w"); 8
fprintf(f,"\n\tLoi ko mo dc file!(BFS.INP)\n"); 8
getch(); 8
exit(1); 8
} 8
else 8
{ 8
17
sinh viên: Hồ Thanh Phong Lớp: 06T4
while (!feof(f)) 8
{ 8
flushall(); 8
fscanf(f,"%d%d",&m, &n); 8
fscanf(f,"%d%d",&S.d ,&S.c); 8
fscanf(f,"%d%d",&E.d ,&E.c); 8
printf("\n\tMa tran vao:\n"); 8
for(i=0;i<m;i++) 8
{ 8
printf("\n\t"); 8

for(j=0;j<n;j++) 8
{ 8
fscanf(f,"%d",&a[i][j]); 8
printf(" %d", a[i][j]); 8
} 8
} 8
} 8
fclose(f); 9
for (i=0;i<m;i++) 9
for (j=0;j<n;j++) 9
check[i][j]=0; //gan cac phan tu trong mang kiem tra bang 0 9
queue[1].d=S.d; //dua diem bat dau vao hang doi 9
queue[1].c=S.c; 9
} 9
} 9
/*=============================*/ 9
void BFS(void) 9
{ 9
int x,y,i; 9
do 9
{ 9
front=front+1; 9
x=queue[front].d;y=queue[front].c; 9
for(i=0;i<=3;i++) 9
if ((a[x+hx[i]][y+hy[i]]==0)&&(x+hx[i]>=0)&& 9
(x+hx[i]<=m-1)&&(y+hy[i]>=0)&&(y+hy[i]<=n-1)&&(check[x+hx[i]]
[y+hy[i]]==0)) 9
{ 9
rear=rear+1; 9
check[x][y]=1; 9

queue[rear].d=x+hx[i]; 9
queue[rear].c=y+hy[i]; 9
pre[rear].d=x; 9
pre[rear].c=y; 9
} 10
} 10
while (front<=rear); 10
} 10
18
sinh viên: Hồ Thanh Phong Lớp: 06T4
// // 10
int truyvet(toado E) 10
{ 10
int i,j,k,d1; 10
i=rear; 10
while ((i>0) && ((E.d != queue[i].d)||(E.c != queue[i].c))) 10
i ; 10
if ((i<=0)|| (a[S.d][S.c]==1)) 10
return -1; 10
else 10
{ 10
d1=i; 10
j=1; 10
DD[j]=pre[d1]; 10
while ((pre[d1].d!=S.d) ||(pre[d1].c!=S.c)) 10
{ 10
for(k=d1-1;k>=1;k ) 10
{ 10
for(i=0;i<=3;i++) 10
if((pre[d1].d+hx[i]==pre[k].d)&&(pre[d1].c+hy[i]==pre[k].c)) 10

{ 10
d1=k; 10
j++; 10
DD[j]=pre[d1]; 11
} 11
} 11
} 11
return j; 11
} 11
} 11
/*=================================*/ 11
//ham xuat du lieu 11
void outputdata() 11
{ int i,j; 11
FILE *f; 11
f=fopen(fileout,"w"); 11
i=truyvet(E); 11
if (i==-1) 11
{ 11
fprintf(f,"\nKhong co duong di tu A[%d][%d] den A[%d][%d]",S.d,S.c,E.d,E.c); 11
printf("\n\tKhong co duong di tu A[%d][%d] den A[%d][%d]",S.d,S.c,E.d,E.c); 11
} 11
else 11
{ 11
fprintf(f,"\t\t DAI HOC BACH KHOA DA NANG"); 11
fprintf(f,"\n\t\t KHOA CONG NGHE THONG TIN\n"); 11
fprintf(f,"\n\t\t DO AN CAU TRUC DU LIEU VA GIAI THUAT\n"); 11
fprintf(f,"\n\t- Sinh vien thuc hien:\n"); 11
19
sinh viên: Hồ Thanh Phong Lớp: 06T4

fprintf(f,"\n\t\t+ Ho Thanh Phong"); 11
fprintf(f,"\n\t- Lop:\t06T4\n"); 11
fprintf(f,"\n\tDuong di ngan nhat tu A[%d][%d] den A[%d][%d]:\n",S.d,S.c,E.d,E.c);
12
for(j=i;j>=1;j ) 12
fprintf(f," \tA[%d][%d]\n",DD[j].d,DD[j].c); 12
fprintf(f," \tA[%d][%d]",E.d,E.c); 12
printf("\n\n\tDuong di ngan nhat tu A[%d][%d] denA[%d][%d]:\n\n",S.d,S.c,E.d,E.c);
12
for(j=i;j>=1;j ) 12
printf(" A[%d][%d] ==>",DD[j].d,DD[j].c); 12
printf(" A[%d][%d]",E.d,E.c); 12
} 12
fclose(f); 12
} 12
//chuong trinh chinh 12
void main(void) 12
{ 12
clrscr(); 12
int n ; 12
char tt; 12
textbackground(GREEN); 12
textcolor(WHITE); 12
printf("\t\t\tDAI HOC BACH KHOA DA NANG"); 12
printf("\n\t\t\tKHOA CONG NGHE THONG TIN\n"); 12
printf("\n\t\t DO AN CAU TRUC DU LIEU VA GIAI THUAT\n"); 12
printf("\n\tSinh vien thuc hien:\n"); 12
printf("\n\t\t- Ho Thanh Phong"); 12
printf("\n\tLop:\t06T4 - Nhom : 12A\n"); 12
printf("\n \n"); 12

printf("\n * DU LIEU VAO : BFSIN - DU LIEU RA : BFSOUT \n"); 13
printf("\n * Nhap 0 de xem huong dan nhap Ma Tran vao file : BFSIN\n "); 13
printf("\n * Nhap 1 so bat ky de xem xem ket qua \n"); 13
printf("\n \n"); 13
chon: printf("\n Ban chon (0/1) : "); 13
scanf ("%d" ,&n); 13
printf("\n \n"); 13
switch (n) 13
{ 13
case 0 : printf("\n\t CAU TRUC DU LIEU NHAP VAO TRONG FILE BFSIN \n\t");
13
printf("\n Sohang Socot \n"); 13
printf("\n Toa do diem bat dau di \n"); 13
printf("\n Toa do diem ket thuc \n"); 13
printf("\n Ma tran duong di giua cac diem \n"); 13
printf("\n \n"); 13
goto chon; 13
20
sinh viên: Hồ Thanh Phong Lớp: 06T4
case 1 : printf("\n\t CAU TRUC DU LIEU NHAP VAO TRONG FILE BFSIN \n\t");
break; 13
default : printf("\n Chon lai nhe (0 | 1 )\n"); goto chon; 13
} 13
inputdata(); 13
BFS(); 13
outputdata(); 13
printf("\n \n"); 13
printf("\n * Co The Xem Ro Hon Ket Qua Trong file : BFSOUT.TXT \n"); 13
getch(); 13
} 13

PHẦN III: KẾT QUẢ 14
PHẦN IV: KẾT LUẬN 16
21

×