// astar.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <stdio.h> #include <iostream.h> #define MaxRow 20 #define MaxCol 30 int themap[MaxRow][MaxCol]={ {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,1,2,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,1,1,1,1,1,1,1,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,1,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,1,0,0,1,1,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,1,0,1,1,0,0,0,1,0,0,1,0,1,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0}, {0,0,1,0,0,0,0,1,0,0,0,1,1,0,1,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0}, {0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,0,1,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0}, {0,0,0,0,0,0,1,0,0,0,1,1,0,1,1,1,0,1,0,0,0,0,0,1,1,1,1,1,1,0}, {0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0}, {0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,1,0,4,0,0,1,0}, {0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,1,1,1,0}, {0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,0,0,0,0,0,1,0,1,0,1,0,0}, {0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}}; struct aStar { int X; int Y; aStar* Pnext; aStar* Ppre; }; aStar* pHeader = NULL; aStar* ptail = NULL; void main() { int X= 2; int Y= 1; int xE = 24; int yE = 15; pHeader = new aStar; pHeader->X = X; pHeader->Y = Y; pHeader->Ppre = NULL; pHeader->Pnext = NULL; ptail = pHeader; aStar* pNew = NULL; static bool BRes = false; for (aStar* ptemp=pHeader;ptemp!=NULL;ptemp=ptemp->Pnext) { if (themap[ptemp->Y+1][ptemp->X] !=1 && themap[ptemp->Y+1][ptemp->X]!=3 && ptemp->Y+1<MaxRow) { pNew = new aStar; pNew->X = ptemp->X;//map横坐标 pNew->Y = ptemp->Y+1;//map纵坐标 themap[ptemp->Y+1][ptemp->X] = 3; pNew->Pnext = NULL; pNew->Ppre = ptemp; ptail->Pnext = pNew; ptail = pNew; if (pNew->X == xE && pNew->Y == yE)//判断是否是到边界还是到终点 到终点的时候结束循环 { BRes = true; break; } } if (themap[ptemp->Y][ptemp->X+1] != 1 && themap[ptemp->Y][ptemp->X+1]!=3 && ptemp->X+1<MaxCol) { pNew = new aStar; pNew->X = ptemp->X+1; pNew->Y = ptemp->Y; themap[ptemp->Y][ptemp->X+1] = 3; pNew->Pnext = NULL; pNew->Ppre = ptemp; ptail->Pnext = pNew; ptail = pNew; if (pNew->X == xE && pNew->Y == yE) { BRes = true; break; } } if (themap[ptemp->Y-1][ptemp->X] != 1 && themap[ptemp->Y-1][ptemp->X]!=3 && ptemp->Y-1>0) { pNew = new aStar; pNew->X = ptemp->X; pNew->Y = ptemp->Y-1; themap[ptemp->Y-1][ptemp->X] = 3; pNew->Pnext = NULL; pNew->Ppre = ptemp; ptail->Pnext = pNew; ptail = pNew; if (pNew->X == xE && pNew->Y == yE) { BRes = true; break; } } if (themap[ptemp->Y][ptemp->X-1] != 1 && themap[ptemp->Y][ptemp->X-1]!=3 && ptemp->X-1>0) { pNew = new aStar; pNew->X = ptemp->X-1; pNew->Y = ptemp->Y; themap[ptemp->Y][ptemp->X-1] = 3; pNew->Pnext = NULL; pNew->Ppre = ptemp; ptail->Pnext = pNew; ptail = pNew; if (pNew->X == xE && pNew->Y == yE) { BRes = true; break; } } if ( !(themap[ptemp->Y][ptemp->X-1] ==1 || themap[ptemp->Y-1][ptemp->X] ==1) && themap[ptemp->Y-1][ptemp->X-1] != 1 && themap[ptemp->Y-1][ptemp->X-1]!=3 && ptemp->Y-1>0 && ptemp->X-1>0 ) { pNew = new aStar; pNew->X = ptemp->X-1; pNew->Y = ptemp->Y-1; themap[ptemp->Y-1][ptemp->X-1] = 3; pNew->Pnext = NULL; pNew->Ppre = ptemp; ptail->Pnext = pNew; ptail = pNew; if (pNew->X == xE && pNew->Y == yE) { BRes = true; break; } } if ( !(themap[ptemp->Y-1][ptemp->X] ==1 || themap[ptemp->Y][ptemp->X+1] ==1) && themap[ptemp->Y-1][ptemp->X+1] != 1 && themap[ptemp->Y-1][ptemp->X+1]!=3 &&ptemp->Y-1>0 && ptemp->X+1<MaxCol) { pNew = new aStar; pNew->X = ptemp->X+1; pNew->Y = ptemp->Y-1; themap[ptemp->Y-1][ptemp->X+1] = 3; pNew->Pnext = NULL; pNew->Ppre = ptemp; ptail->Pnext = pNew; ptail = pNew; if (pNew->X == xE && pNew->Y == yE) { BRes = true; break; } } if ( !(themap[ptemp->Y+1][ptemp->X] ==1 || themap[ptemp->Y][ptemp->X-1] ==1) && themap[ptemp->Y+1][ptemp->X-1] != 1 && themap[ptemp->Y+1][ptemp->X-1]!=3 && ptemp->Y+1<MaxRow && ptemp->X-1>0) { pNew = new aStar; pNew->X = ptemp->X-1; pNew->Y = ptemp->Y+1; themap[ptemp->Y+1][ptemp->X-1] = 3; pNew->Pnext = NULL; pNew->Ppre = ptemp; ptail->Pnext = pNew; ptail = pNew; if (pNew->X == xE && pNew->Y == yE) { BRes = true; break; } } if ( !(themap[ptemp->Y][ptemp->X+1] ==1 || themap[ptemp->Y+1][ptemp->X] ==1) && themap[ptemp->Y+1][ptemp->X+1] != 1 && themap[ptemp->Y+1][ptemp->X+1]!=3 && ptemp->Y+1<MaxRow && ptemp->X+1<MaxCol) { pNew = new aStar; pNew->X = ptemp->X+1; pNew->Y = ptemp->Y+1; themap[ptemp->Y+1][ptemp->X+1] = 3; pNew->Pnext = NULL; pNew->Ppre = ptemp; ptail->Pnext = pNew; ptail = pNew; if (pNew->X == xE && pNew->Y == yE) { BRes = true; break; } } } for (int n = 0;n<MaxRow;n++) { for (int t = 0;t<MaxCol;t++) { if(themap[n][t] == 3) { themap[n][t] = 0; } } } if (BRes == true) { for (aStar* ptempE = ptail;ptempE->Ppre!=NULL;ptempE=ptempE->Ppre) { themap[ptempE->Y][ptempE->X] = 5; } } for (int nE = 0;nE<MaxRow;nE++) { for (int tE = 0;tE<MaxCol;tE++) { //printf("%d ",themap[nE][tE]); switch(themap[nE][tE]) { case 0: cout<<"※"; break; case 1: cout<<"■"; break; case 2: cout<<"☆"; break; case 4: cout<<"№"; break; case 5: cout<<"◎"; break; default: break; } } cout<<endl; } aStar* ptempE = NULL; while (pHeader!=NULL) { ptempE = pHeader; pHeader = pHeader->Pnext; delete ptempE; } }