Anh/chị có thể giải thích giúp em bài này với k ạ, em có đọc qua và xem youtube nhưng cũng k hiểu lắm ạ. Em cảm ơn ạ.
#include<conio.h>
#include<stdlib.h>
#include<stdio.h>
#include<winbgim.h>
#define MAX 10
int A[MAX][MAX];
int C[MAX], B[MAX];
int n;
int d;
int x[10]= {250,250,400,400,300,250,150,250,350,500};
int y[10]= {250,150,150,250,400,450,450,200,200,150};
void nhap()
{
printf("Nhap vao so dinh ma tran: ");
scanf("%d", &n);
printf("-----Nhap duong di ma tran-----\n ");
printf("0: khong co duong di\n");
printf("1: co duong di\n");
for(int i=1; i<=n; i++)
{
for(int j =i; j<=n; j++)
{
if(i==j) A[i][j]=0;
else
{
printf("Duong di tu dinh %d den dinh %d: ",i,j);
scanf("%d", &A[i][j]);
A[j][i]=A[i][j];
}
}
}
}
void WriteFile(){
FILE *f;
f= fopen("Nhom11.text","w");
fprintf(f, "%d\n",n);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
fprintf(f, "%d ",A[i][j]);
fprintf(f,"\n");
}
printf("Ghi file thanh cong!\n");
fclose(f);
}
void ReadFile(int A[MAX][MAX],int &n){
FILE *f;
f=fopen("Nhom11.text","rt");
fscanf(f,"%d",&n);
for(int i=1; i<=n; i++){
for(int j=1; j<=n; j++){
fscanf(f,"%d",&A[i][j]);
}
}
printf("Doc file thanh cong!\n");
fclose(f);
}
void initarray()
{
for (int i=1; i<=n; i++)
{
C[i]=0;
B[i]=0;
}
}
void ketqua()
{
printf("Duong di Hamilton: ");
for(int i=1; i<=n; i++)
printf("%d ",B[i]);
d++;
printf("\n");
}
void Hamilton(int B[MAX], int C[MAX], int i)
{
int j;
for(j=1; j<=n; j++)
{
if(A[B[i-1]][j]==1 && C[j]==0)
{
B[i]=j;
C[j]=1;
if(i<n) Hamilton(B, C, i+1);
else ketqua();
C[j]=0;
}
}
}
void HamiltonPeak(int B[MAX], int C[MAX], int i,int p)
{
int j;
for(j=1; j<=n; j++)
{
if(A[B[i-1]][j]==1 && C[j]==0)
{
if(i==1 && B[1]==0)
{
C[p]=1;
B[1]=p;
B[i+1]=j;
C[j]=1;
i++;
if(i<n) Hamilton(B, C, i+1);
else ketqua();
C[j]=0;
}
else
{
B[i]=j;
C[j]=1;
if(i<n) Hamilton(B, C, i+1);
else ketqua();
C[j]=0;
}
}
}
initarray();
}
void CreatePeak()
{
for(int i=1; i<=n; i++)
{
char kt[100];
setcolor(2);// mau ve hien tai la mau xanh
circle(x[i-1],y[i-1],20);// ve duong tron tam(x,y) ban kinh 20
setfillstyle(15,2);// mau to 15 va mau to xanh la
floodfill(x[i-1], y[i-1], 2);// to mau mot vung kin chua diem x,y va mau c trung voi setfillstyle
settextstyle(0,0,2);// font, huong, co chu
setcolor(0);// mau chu
//snprintf(kt, sizeof(kt), "%d", i);
itoa(i,kt,10);
outtextxy(x[i-1]-8, y[i-1]-8,kt);// viet van ban "kt" tai vi tri x,y
}
}
void CreateLink()
{
for(int i=1; i<=n; i++)
{
for(int j=i; j<=n; j++)
{
if(A[i][j]==1)
{
setcolor(4);// mau duong ve la mau do
setlinestyle(0,0,2);// kieu duong, mau to va do dam
line(x[i-1],y[i-1],x[j-1],y[j-1]);// ve duong tu x,y den x1,y1
}
}
}
}
void Graphic()
{
initwindow(900,700);
setbkcolor(7);// hinh nen mau xam
cleardevice();
CreatePeak();
CreateLink();
getch();
}
void menu(){
printf("\n--------Thao tac voi chuong trinh--------\n");
printf("1.Nhap do thi\n");
printf("2.Ghi du lieu vao file\n");
printf("3.Doc du lieu tu file\n");
printf("4.Hien tat ca duong di hamilton cua do thi\n");
//printf("5.Tim duong di tu mot dinh nao do cua do thi\n");
printf("5.Do hoa mo phong do thi\n");
printf("0. Thoat chuong trinh\n");
}
int main(){
initarray();
int i=1;
d = 0;
int chon;
do{
menu();
printf("Chon tu 0-5 de thuc hien chuong trinh: ");
scanf("%d",&chon);
switch(chon){
case 1 : nhap();
break;
case 2 : WriteFile();
break;
case 3: ReadFile(A,n);
break;
case 4: d=0;
for(int j=1;j<=n;j++)
{
B[0]=j;
HamiltonPeak(B,C,i,j);
}
if(d==0){
printf("--Khong co duong di hamilton--\n");
}
break;
case 5: Graphic();
break;
case 0: exit(0);
default :printf("Ban da chon sai thao tac, vui long chon lai!\n");
break;
}
} while(chon!=0);
getch();
}