0866116-thuật toán ttnt

30
/*Code by: Hondacodon*/ 1 Thut toán LC-BFS(Least Cost -Breadth First Search=tìm ki ếm chi phí ít nht theo chi u Rng) trước tiên bn phi to 1 file input.txt trong đĩa C:/ #include "stdafx.h" #include<stdio.h> #include<conio.h> #include<string.h> #define MAX 100 typedef struct Queue//khai bao' hang doi { int *QArray; int QMax; int QNumItems; int QFront; int QRear; }QUEUE; int InitQueue(QUEUE &q,int MaxItems)//khoi tao Hang` doi Rong { q.QArray=new int [MaxItems]; if(q.QArray==NULL) return 0; //het bo nho de cap phat'

Upload: mua-vo-tinh

Post on 28-Oct-2014

293 views

Category:

Documents


5 download

TRANSCRIPT

Page 1: 0866116-Thuật toán  TTNT

/*Code by: Hondacodon*/ 1

Thuật toán LC-BFS(Least Cost -Breadth First Search=tìm kiếm

chi phí ít nhất theo chiều Rộng)

trước tiên bạn phải tạo 1 file input.txt trong ổ đĩa C:/

#include "stdafx.h"

#include<stdio.h>

#include<conio.h>

#include<string.h>

#define MAX 100

typedef struct Queue//khai bao' hang doi

{

int *QArray;

int QMax;

int QNumItems;

int QFront;

int QRear;

}QUEUE;

int InitQueue(QUEUE &q,int MaxItems)//khoi tao Hang` doi

Rong

{

q.QArray=new int [MaxItems];

if(q.QArray==NULL)

return 0; //het bo nho de cap phat'

Page 2: 0866116-Thuật toán  TTNT

/*Code by: Hondacodon*/ 2

q.QMax=MaxItems;

q.QNumItems=0;

q.QFront=q.QRear= -1; //-1 tuc' la` chua co phan tu

nao trong Quenue

return 1; //khoi tao thanh cong

}

int IsQueueEmpty(const QUEUE &q)//kiem tra hang doi co

rong hay ko

{

if(q.QNumItems== -1)

{

return 1; // Queue Rong

}

return 0; //Queue Ko Rong

}

//Kiem tra Quenue da^y`

int IsQueueFull(const QUEUE &q)//kiem tra hang` doi co'

day` hay chua

{

if(q.QNumItems==q.QMax)

{

return 1; //Queue day

}

return 0; //Queue chua day

}

int DeQueue(QUEUE &q , int newitem)//lay 1 pt o dau

Queue,co the lam Queue thay doi

Page 3: 0866116-Thuật toán  TTNT

/*Code by: Hondacodon*/ 3

{

if(IsQueueFull(q))

{

return 0; //Quenue day ko them dc

}

q.QRear++;

if(q.QRear==q.QMax)

{

q.QRear=0;

}

q.QArray[q.QRear]=newitem;

if(IsQueueEmpty(q))

q.QFront=0;

q.QNumItems++;

return 1;// them thanh cong

}

int EnQueue(QUEUE &q , int &outitem)//them 1 pt o cuoi

Queue,co the lam Queue thay doi

if(IsQueueEmpty(q))

return 0;

outitem=q.QArray[q.QFront];

q.QFront++;

q.QNumItems--;

if(q.QFront==q.QMax)

q.QFront=0;

if(IsQueueEmpty(q))

q.QFront=q.QRear=-1;

Page 4: 0866116-Thuật toán  TTNT

/*Code by: Hondacodon*/ 4

return 1;

}

//kiem tra 1 phan tu o dau Quenue, ko lam thay doi Queue

int QueueFront(const QUEUE &q , int &outitem)

{

if(IsQueueEmpty(q))

return 0; //Queue rong ,ko lay ra dc

outitem=q.QArray[q.QFront];//lay pt dau ra

return 1;

}

//kiem tra 1 phan tu o CuoiQuenue, ko lam thay doi Queue

int QueueRear(const QUEUE &q , int &outitem)

{

if(IsQueueEmpty(q))

return 0;

outitem=q.QArray[q.QRear];//lay pt o cuoi ra

return 1;

}

struct MYGRAPH

{

int N;

int A[MAX][MAX];

int Previous[MAX];

};

Page 5: 0866116-Thuật toán  TTNT

/*Code by: Hondacodon*/ 5

void InputGraph(MYGRAPH &g,char *file,int &start ,int

&end)

{

int b=0;

FILE*f= fopen(file,"r");

fscanf(f,"%d",&g.N);

fscanf(f,"%d",&start);

fscanf(f,"%d",&end);

int i=0,j=0;

while(!feof(f))

{

if(b%g.N==0 && b!=0)

{

i++;

j=0;

}

fscanf(f,"%d",&g.A[i][j]);

j++;

b++;

}

for(i=0;i<g.N;i++)

{

g.Previous[i]=-1;

}

fclose(f);

}

int BFS(MYGRAPH &g,int start,int end)

Page 6: 0866116-Thuật toán  TTNT

/*Code by: Hondacodon*/ 6

{

int k[MAX];

QUEUE q;

InitQueue(q,100);

int flag=0;

DeQueue(q,start);

k[start]=0;

int s;

g.Previous[start] = -2;

while(IsQueueEmpty(q)==0)

{

PushQueue(q,s);

for(int i=0;i<g.N;i++)

{

if((g.A[s][i]!=0 && g.Previous[i]==-1) ||

(g.A[s][i]!=0 && k[s] +g.A[s][i]<k[i]))

{

PushQueue(q,i);

g.Previous[i]=s;

k[i]=k[s]+g.A [s][i];

}

}

}

if (g.Previous [end]==-1)

return 0;

else

return 1;

Page 7: 0866116-Thuật toán  TTNT

/*Code by: Hondacodon*/ 7

}

void PrintPath(MYGRAPH g,int end)

{

int i=end;

printf("\nDuong di ngan nhat cua thuat toan BFS

la`:\n");

printf("%d",end);

i=g.Previous[i];

while(i!=-2)

{

printf("<-- %d",i);

i=g.Previous[i];

}

}

void main()

{

MYGRAPH g;

int start,end;

InputGraph(g,"C:/input.txt",start ,end);

printf("tim` duong di ngan' nhat Tu %d -->

%d\n",start,end);

if(BFS(g,start,end))

{

Page 8: 0866116-Thuật toán  TTNT

/*Code by: Hondacodon*/ 8

PrintPath(g,end);

}

printf("\n");

getch();

}

Thuật Toán BFS LC BFS là thuật toán nâng cấp cua BFS tạo 1 file input.txt nhu thaut toan LCBFS

// BFS.cpp : Defines the entry point for the console

application.

//

#include "stdafx.h"

#include<stdio.h>

#include<conio.h>

#include<string.h>

#define MAX 100

typedef struct Queue

{

int *QArray;

int QMax;

int QNumItems;

int QFront;

int QRear;

}QUEUE;

Page 9: 0866116-Thuật toán  TTNT

/*Code by: Hondacodon*/ 9

int InitQueue(QUEUE &q,int MaxItems)

{

q.QArray=new int [MaxItems];

if(q.QArray==NULL)

return 0;

q.QMax=MaxItems;

q.QNumItems=0;

q.QFront=q.QRear=-1;

return 1;

}

int IsQueueEmpty(const QUEUE &q)

{

if(q.QNumItems==0)

{

return 1;

}

return 0;

}

int IsQueueFull(const QUEUE &q)

{

if(q.QNumItems==q.QMax)

{

return 1;

}

return 0;

Page 10: 0866116-Thuật toán  TTNT

/*Code by: Hondacodon*/ 10

}

int EnQueue(QUEUE &q , int newitem)

{

if(IsQueueFull(q))

{

return 0;

}

q.QRear++;

if(q.QRear==q.QMax)

{

q.QRear=0;

}

q.QArray[q.QRear]=newitem;

if(IsQueueEmpty(q))

q.QFront=0;

q.QNumItems++;

return 1;

}

int DeQueue(QUEUE &q , int &outitem)

{

if(IsQueueEmpty(q))

return 0;

outitem=q.QArray[q.QFront];

q.QFront++;

q.QNumItems--;

Page 11: 0866116-Thuật toán  TTNT

/*Code by: Hondacodon*/ 11

if(q.QFront==q.QMax)

q.QFront=0;

if(IsQueueEmpty(q))

q.QFront=q.QRear=-1;

return 1;

}

int QueueFront(const QUEUE &q , int &outitem)

{

if(IsQueueEmpty(q))

return 0;

outitem=q.QArray[q.QFront];

return 1;

}

int QueueRear(const QUEUE &q , int &outitem)

{

if(IsQueueEmpty(q))

return 0;

outitem=q.QArray[q.QRear];

return 1;

}

struct MYGRAPH

{

int N;

int A[MAX][MAX];

int Previous[MAX];

Page 12: 0866116-Thuật toán  TTNT

/*Code by: Hondacodon*/ 12

};

void InputGraph(MYGRAPH &g,char *file,int &start ,int

&end)

{

int b=0;

FILE*f= fopen(file,"r");

fscanf(f,"%d",&g.N);

fscanf(f,"%d",&start);

fscanf(f,"%d",&end);

int i=0,j=0;

while(!feof(f))

{

if(b%g.N==0 && b!=0)

{

i++;

j=0;

}

fscanf(f,"%d",&g.A[i][j]);

j++;

b++;

}

for(i=0;i<g.N;i++)

{

g.Previous[i]=-1;

}

fclose(f);

}

int BFS(MYGRAPH &g,int start,int end)

Page 13: 0866116-Thuật toán  TTNT

/*Code by: Hondacodon*/ 13

{

QUEUE q;

InitQueue(q,100);

int flag=0;

EnQueue(q,start);

int s;

g.Previous[start] = -2;

while(IsQueueEmpty(q)==0 && flag==0)

{

DeQueue(q,s);

for(int i=0;i<g.N;i++)

{

if(g.A[s][i]!=0 && g.Previous[i]==-1)

{

EnQueue(q,i);

g.Previous[i]=s;

if(i==end)

{

flag=1;

return flag;

}

}

}

}

return flag;

}

void PrintPath(MYGRAPH g,int end)

Page 14: 0866116-Thuật toán  TTNT

/*Code by: Hondacodon*/ 14

{

int i=end;

printf("\nDuong di ngan nhat la:\t");

printf("%d",end);

i=g.Previous[i];

while(i!=-2)

{

printf("<- %d",i);

i=g.Previous[i];

}

}

void main()

{

MYGRAPH g;

int start,end;

InputGraph(g,"C:/input.txt",start ,end);

printf("duong di BFS duyet theo chieu rong tu:%d -->

%d \n",start,end);

if(BFS(g,start,end))

{

PrintPath(g,end);

}

Page 15: 0866116-Thuật toán  TTNT

/*Code by: Hondacodon*/ 15

printf("\n\n");

}

Thuật Toán UCS

// UCS.cpp : Defines the entry point for the console

application.

//#include "stdafx.h"

#include <conio.h>

#include <stdio.h>

#include <stdlib.h>

typedef struct map

{

int n;

int a[100][100];

int ChiPhi[100];

int DaXet[100];

int LuuVet[100];

};

typedef struct map DoThi;

//cac ham dc khai bao

//void Doc_Mang(DoThi &d,char *fn,int &start,int &end) ;

//void Khoi_Tao(DoThi &d);

//void ThanhDong_UCS(DoThi &d,int start,int end);

int Path_ThanhDong_UCS(DoThi d,char *fn,int start,int

end);

//---------------------------------------------------//

//ham void main()

//------------------------------------------//

//ham doc file input.txt

void Doc_Mang(DoThi &d,char *fn,int &start,int &end)

{

FILE *f=fopen(fn,"r");

int i,j;

if (f!= NULL)

{

fscanf (f,"%d",&d.n);

fscanf(f,"%d %d",&start,&end);

for (i=0;i<d.n;i++)

{

for (j=0;j<d.n;j++)

{

Page 16: 0866116-Thuật toán  TTNT

/*Code by: Hondacodon*/ 16

fscanf (f,"%d",&d.a[i][j]);

if(d.a[i][j]==0) d.a[i][j]=3000;

}

}

printf("\nMo File Thanh Cong");

}

else

{

printf ("Loi Mo File !! ");

}

fclose(f);

}

//-----------------------------------//

//ham khoi tao

void Khoi_Tao(DoThi &d)

{

int i;

for (i=0;i<d.n;i++)

{

d.ChiPhi[i] = 0;

d.DaXet[i] = 0;

d.LuuVet[i] = 0;

}

}

//---------------------//

//ham thuat toan UCS

void ThanhDong_UCS(DoThi &d,int start,int end)

{

int u,i;

int min;

d.ChiPhi[start]=0;d.DaXet[start]=1;d.LuuVet[start]=1;

while (!d.DaXet[end])

{

min=3000;

for (i=0;i<d.n;i++)

{

if((!d.DaXet[i])&& (min > d.ChiPhi[i]))

{

min = d.ChiPhi[i];

u = i;

}

}

d.DaXet[u]=1;

if (!d.DaXet[end])

Page 17: 0866116-Thuật toán  TTNT

/*Code by: Hondacodon*/ 17

{

for (i=0;i<d.n;i++)

{

if ((!d.DaXet[i]) && (d.ChiPhi[i] >

(d.ChiPhi[u] + d.a[u][i])))

{

d.ChiPhi[i] = d.ChiPhi[u] + d.a[u][i];

d.LuuVet[i] = u;

}

}

}

}

}

//-------------------------------------------------------

-----------------//

//ham tim tim duong dj tren thuat toan UCS

int Path_ThanhDong_UCS(DoThi d,char*fn,int start,int end)

{

int i,khong=0;

FILE *f=fopen(fn,"wt");

if(f==NULL)

return 0;

for (i=0;i<d.n;i++)

{

d.ChiPhi[i]=d.a[start][i];

d.LuuVet[i] = start;

d.DaXet[i]=0;

}

ThanhDong_UCS(d,start,end);

if(d.DaXet[end]==1)

{

if(start==end)

{

fprintf(f,"%d\n",khong);

fprintf(f,"%d",start);

}

else

{

fprintf(f,"%d\n",d.ChiPhi[end]);

fprintf(f,"%d ",end);

i=d.LuuVet[end];

while (i!=start)

{

fprintf(f,"%d ",i);

i=d.LuuVet[i];

}

fprintf(f,"%d ",start);

}

}

else

Page 18: 0866116-Thuật toán  TTNT

/*Code by: Hondacodon*/ 18

fprintf(f,"0");

return 1;

fclose(f);

}

int main()

{

DoThi d;int start,end;

Doc_Mang(d,"input.txt",start,end);

Khoi_Tao(d);

ThanhDong_UCS(d,start,end);

Path_ThanhDong_UCS(d,"C:/UCS_input.txt",start,end);

return 0;

getch();

}

Thuật Toán DFS

/*file ma tran:

6

1 2 3 4 5 6

0 0 1 1 2 2

3 3 4 4 5 6

8 2 0 1 2 3

1 2 1 1 1 3

2 2 2 0 0 0

*/

#include <iostream.h>

#include <conio.h>

#define MAX 100

struct Graph{

int n;

int data[MAX][MAX];

};

struct stack{

int data;

stack *next;

};

typedef stack *pstack;

struct node{

int data;

node *next;

};

Page 19: 0866116-Thuật toán  TTNT

/*Code by: Hondacodon*/ 19

typedef node *pnode;

void createStack(pstack &S);

void insertTop(pstack &S, int x);

void getTop(pstack &S, int &t);

void insert(pnode &H, int x);

void outputMatrix(Graph A);

void output(pnode H);

void readFile(char *path, Graph &A);

int isScalar(Graph A);//1: Yes - 0: No

int calculateOrderTip(Graph A, int o);

int isVisited(pnode C, int t);//1: Yes - 0: No

void findNextDoor(int Tip, Graph A, pnode &H);

void DFS(Graph A);

int main()

{

int x;

char path[MAX];

Graph A;

cout<<"Nhap duong dan tap tin: ";

gets(path);

readFile(path,A);

cout<<"Matran vua nhap: "<<"\n";

outputMatrix(A);

cout<<"Nhap dinh can tinh bac: ";

cin>>x;

cout<<"Bac cua dinh la: "<<calculateOrderTip(A,x);

cout<<"\nDuyet Do thi theo DFS: ";

DFS(A);

getch();

return EXIT_SUCCESS;

}

void readFile(char * path, Graph &A)

{

FILE *f;

int i,j;

f=fopen(path,"rt");

if (f == NULL)

{

cout<<"Loi mo file!";

return;

}

fscanf(f,"%d ",&A.n);

while (!feof(f))

{

for (i=0; i<A.n; i++)

{

for (j=0; j<A.n; j++)

Page 20: 0866116-Thuật toán  TTNT

/*Code by: Hondacodon*/ 20

{

fscanf(f,"%d ",&A.data[i][j]);

}

}

}

fclose(f);

}

void createStack(pstack &S)

{

S= NULL;

}

void insert(pnode &H, int x)

{

pnode p;

if (H==NULL)

{

p=new node;

p->data=x;

p->next=H;

H=p;

}

else

{

p=H;

while (p->next!=NULL)

p=p->next;

p->next=new node;

p=p->next;

p->data = x;

p->next=NULL;

}

}

void insertTop(pstack &S, int x)

{

pstack p;

p=new stack;

p->data=x;

p->next=S;

S=p;

}

void getTop(pstack &S, int &t)

{

pstack p;

if (S== NULL)

{

cout<<"Stack is empty!";

}

else

Page 21: 0866116-Thuật toán  TTNT

/*Code by: Hondacodon*/ 21

{

t=S->data;

p=S;

S=S->next;

delete p;

}

}

void outputMatrix(Graph A)

{

int i,j;

for (i=0; i<A.n; i++)

{

for (j=0; j<A.n; j++)

{

cout<<A.data[i][j]<<" ";

}

cout<<"\n";

}

}

void output(pnode H)

{

pnode p=H;

if (H==NULL)

cout<<"Danh sach rong!";

else

{

while (p!= NULL)

{

cout<<p->data<<" ";

p=p->next;

}

}

}

int isScalar(Graph A)

{

int i,j;

for (i=0; i<A.n; i++)

{

for (j=0; j<A.n; j++)

{

if (A.data[i][j] != A.data[j][i])

{

return false;

}

}

}

return true;

}

Page 22: 0866116-Thuật toán  TTNT

/*Code by: Hondacodon*/ 22

int calculateOrderTip(Graph A,int o)

{

int i;

int S=0;

if (isScalar(A))

{

for (i=0; i<A.n; i++)

{

S+=A.data[o][i];

}

}

else

{

for (i=0; i<A.n; i++)

{

S+=A.data[o][i];

}

for (i=0; i<A.n; i++)

{

S+=A.data[i][o];

}

}

return S;

}

int isVisited(pnode C, int t)

{

pnode p=C;

while (p!=NULL)

{

if (p->data == t)

{

return true;

}

p=p->next;

}

return false;

}

void findNextDoor(int Tip, Graph A, pnode &H)

{

int i;

for (i=0; i<A.n;i++)

{

if (A.data[Tip][i] > 0)

{

insert(H,i);

}

}

}

Page 23: 0866116-Thuật toán  TTNT

/*Code by: Hondacodon*/ 23

void DFS(Graph A)

{

pnode C=NULL;

int i=0;int j;

int temp;

pnode H;

pnode p;

pstack O;

createStack(O);

do

{

for (j=0; j<A.n;j++)

{

if (!isVisited(C,j))

{

insertTop(O,j);

break;

}

}

while (O != NULL)

{

H=NULL;

getTop(O,temp);

if (!isVisited(C,temp))

{

insert(C,temp);

i++;

findNextDoor(temp,A,H);//Finf all Tip

next-door to the current Tip

//Put Tip into O

p=H;

while (p!=NULL)

{

insertTop(O,p->data);

p=p->next;

}

}

}

}while (i<=A.n-1);

//Output DFS

output(C);

}

Thuật Toán A*(A start)

Page 24: 0866116-Thuật toán  TTNT

/*Code by: Hondacodon*/ 24

/* file:input.txt

6 4

1 3

8 8

0 0 0 0 0 0 0 0

0 0 0 0 0 1 0 0

0 0 0 0 1 1 1 0

1 1 1 1 0 1 1 0

0 0 1 1 1 1 1 0

0 0 0 1 1 0 1 0

0 0 0 0 0 0 1 0

0 0 0 0 0 0 0 0

*/

#include "stdafx.h"

#include <stdio.h>

#include <conio.h>

#include <math.h>

#include "stdlib.h"

struct vitri

{

int x;

int y;

};

typedef struct trangthai

{

vitri vector;

int g;

int f;

int huong;

vitri Pre;

}TT;

struct QUEUE

{

TT *mang;

int max;

int size;

int start;

int end;

};

TT dong[100][100];

struct dothi

{

int n;

int m;

int **a;

};

Page 25: 0866116-Thuật toán  TTNT

/*Code by: Hondacodon*/ 25

int nhapfile(dothi &l,char *fn,TT &start,TT &end)

{

FILE*f=fopen(fn,"rt");

if(f==NULL)

{

return 0;//printf("\nMO File Bi Loi!\n");

}

else

{

fscanf(f,"%d %d",&start.vector.x,&start.vector.y);

fscanf(f,"%d %d",&end.vector.x,&end.vector.y);

fscanf(f,"%d %d",&l.m,&l.n);

l.a=new int*[l.m];

for(int i=0;i<l.m;i++)

{

l.a[i]=new int[l.n];

for(int j=0;j<l.n;j++)

{

fscanf(f,"%4d",&l.a[i][j]);

printf("%4d",l.a[i][j]);

dong[i][j].huong=-2;

}

printf("\n");

}

}

fclose(f);

return 1;

}

int khoitao_Queue(QUEUE &Q,int max)

{

Q.mang=new TT[max];

if(Q.mang==NULL)

return 0;

Q.max=max;

Q.size=0;

Q.start=Q.end=-1;

return 1;

}

int kiemtraRong(const QUEUE &Q)

{

if(Q.size==0)

return 1;

return 0;

}

int kiemtraDay(const QUEUE &Q)

{

if(Q.size>=Q.max)

return 1;

return 0;

}

Page 26: 0866116-Thuật toán  TTNT

/*Code by: Hondacodon*/ 26

int dua_vao_hangdoi(QUEUE &Q,TT &x)

{

if(kiemtraDay(Q))

return 0;

Q.end++;

if(Q.end==Q.max)

Q.end=0;

Q.mang[Q.end]=x;

if(kiemtraRong(Q))

Q.start=0;

Q.size++;

return 1;

}

int lay_giatri(QUEUE &Q,TT &value)

{

if(kiemtraRong(Q))

return 0;

int min=Q.start;

int timkiemdiachi=0;

int i=Q.start+1;

for(;i<Q.size;i++)

{

if(Q.mang[i].f<Q.mang[min].f)

min=i;

if(i==Q.end)

{

timkiemdiachi=1;

break;

}

}

if(timkiemdiachi=0)

{

for(int j=0;j<Q.end;j++)

if(Q.mang[j].f<Q.mang[min].f)

min=j;

}

value=Q.mang[min];

Q.mang[min]=Q.mang[Q.end];

Q.size--;

if(kiemtraRong(Q))

Q.start=Q.end=-1;

else

{

Q.end--;

if(Q.end<0)

Q.end=Q.max-1;

}

return 1;

}

int h(vitri u, vitri v)

Page 27: 0866116-Thuật toán  TTNT

/*Code by: Hondacodon*/ 27

{

int kq;

int x=abs(u.x -v.x);

int y=abs(u.y -v.y);

kq=(x +y);

return kq;

}

int sosanh2vectoc(vitri u,vitri v)

{

if(u.x == v.x && u.x == v.x)

return 1;

return 0;

}

TT day(vitri dau,TT v,vitri cuoi,int m)

{

TT kq;

kq.vector.x= dau.x;

kq.vector.y= dau.y;

kq.g= v.g + 1;

kq.f = kq.g + h(kq.vector,cuoi);

kq.huong=m;

kq.Pre.x= v.vector.x;

kq.vector.y= v.vector.y;

return kq;

}

int AStar(dothi d,TT dau,TT cuoi)

{

if(sosanh2vectoc(dau.vector,cuoi.vector))

return 1;

QUEUE Q;

int k=d.m+d.n;

khoitao_Queue(Q,k);

dau.g=0;

dau.f=h(dau.vector,cuoi.vector);

dau.huong=-1;

dua_vao_hangdoi(Q,dau);

while(!kiemtraRong(Q))

{

TT k;

lay_giatri(Q,k);

if(sosanh2vectoc(k.vector,cuoi.vector))

{

dong[k.vector.x][k.vector.y].Pre=k.Pre;

dong[k.vector.x][k.vector.y].huong=k.huong;

dong[k.vector.x][k.vector.y].g=k.g;

return 1;

}

if(dong[k.vector.x][k.vector.y].huong<0)

{

dong[k.vector.x][k.vector.y].Pre = k.Pre;

dong[k.vector.x][k.vector.y].huong = k.huong;

Page 28: 0866116-Thuật toán  TTNT

/*Code by: Hondacodon*/ 28

vitri u;

u.x = k.vector.x - 1;

u.y= k.vector.y;

if(u.x >= 0)

{

if(d.a[u.x][u.y] == 0)

{

if(dong[u.x][u.y].huong == -2)

{

TT t = day(u,k,cuoi.vector,0);

dua_vao_hangdoi(Q,t);

}

}

}

u.x = k.vector.x;

u.y= k.vector.y+ 1;

if(u.y<d.n)

{

if( d.a[u.x][u.y] == 0)

{

if(dong[u.x][u.y].huong == -2)

{

TT t = day(u,k,cuoi.vector,1);

dua_vao_hangdoi(Q,t);

}

}

}

u.x = k.vector.x+1;

u.y= k.vector.y;

if(u.x < d.m )

{

if( d.a[u.x][u.y] == 0)

{

if(dong[u.x][u.y].huong == -2)

{

TT t = day(u,k,cuoi.vector,2);

dua_vao_hangdoi(Q,t);

}

}

}

u.x = k.vector.x;

u.y = k.vector.y-1;

if(u.y >= 0)

{

if(d.a[u.x][u.y] == 0)

{

Page 29: 0866116-Thuật toán  TTNT

/*Code by: Hondacodon*/ 29

if(dong[u.x][u.y].huong == -2)

{

TT t = day(u,k,cuoi.vector,3);

dua_vao_hangdoi(Q,t);

}

}

}

}

}

return 0;

}

int Output(TT end,int kq,char *fn)

{

FILE *f = fopen(fn,"wt");

if(f==NULL)

return 0;

else

{

if(kq)

{

if(dong[end.vector.x][end.vector.y].g == 0)

{

fprintf(f,"0");

fclose(f);

exit(1);

}

int duongdi[100];

int dodai = 0;

duongdi[dodai++] =

dong[end.vector.x][end.vector.y].huong;

vitri prev =

dong[end.vector.x][end.vector.y].Pre;

while(dong[prev.x][prev.y].huong!= -1)

{

duongdi[dodai++] =

dong[prev.x][prev.y].huong;

prev = dong[prev.x][prev.y].Pre;

}

fprintf(f,"%d\n",dong[end.vector.x][end.vector.y].g);

for(int j = dodai - 1; j >= 0; j--)

fprintf(f,"%d ",duongdi[j]);

}

else

fprintf(f,"-1");

fclose(f);

}

Page 30: 0866116-Thuật toán  TTNT

/*Code by: Hondacodon*/ 30

return 1;

}

int main(int argc, char* argv[])

{

dothi d;

TT start,end;

int kq=AStar(d,start,end);

if(nhapfile(d,"input.txt",start,end)==0)

printf("\nMO File Bi Loi!\n");

else

printf("MO file thanh cong!");

Output(end,kq,"0863031.txt");

return 0;

}