用c++實現走迷宮,最短路徑、廣度優先遍歷、隊列、看懂它,你就掌握了數據結構的幾種最常用的算法(c語言也可以看得懂)


#include<iostream>
using namespace std;

void EnQueue(int i,int j,int k); //入隊一個節點
void DeQueue(int *i,int *j,int *k); //獲取當前節點的序號和對應的迷宮坐標,然后出列
bool GetNextPos(int *i ,int *j,int count); //得到下一個鄰接點的位置
void ShortestPath_BFS(int i,int j); //廣度優先遍歷尋找最短路徑
void ShortestPath(); //輸出最短路徑
void Print(); //輸出迷宮形狀

int Map[10][10] = {{1,1,1,1,1,1,1,1,1,1},{1,0,0,1,0,0,0,1,0,1},{1,0,0,1,0,0,0,1,0,1},{1,0,0,0,0,1,1,0,0,1}, {1,0,1,1,1,0,0,0,0,1},
{1,0,0,0,1,0,0,0,0,1},{1,0,1,0,0,0,1,0,0,1},{1,0,1,1,1,0,1,1,0,1},{1,1,0,0,0,0,0,0,0,0},{1,1,1,1,1,1,1,1,1,1}};

struct Node
{
int parent_id; //保存父節點的位置
int node_id; //當前節點的序號,以便傳遞給孩子節點
int x,y; //當前結點對應的坐標
}Q[10*10]; //每個節點包含迷宮坐標、隊列中的序號、父節點的序號,多個節點形成隊列

int front = 0,rear = 0; //隊列頭指針和尾指針

void main()
{
cout<<"程序說明:"<<'\n'<<"1.輸出路徑為最短路徑;"<<'\n'<<"2.默認的出口在最右下角,如有需要可以調整。"<<'\n'<<'\n';
cout<<"初始地圖如下:"<<endl;
Print();
int i,j;

reinput: cout<<"請輸入起點坐標(x,y): "<<endl; cin>>i>>j;

if(Map[i][j])
{
cout<<"不能從該處出發,請重新輸入!"<<endl;goto reinput;
}
ShortestPath_BFS(i,j); cout<<"最短路徑之一如下:"<<endl;
ShortestPath();
}

void EnQueue(int i,int j,int k) //入隊一個節點
{
Q[rear].x = i;
Q[rear].y = j; //保存當前節點對應的坐標位置
Q[rear].parent_id = k; //保存父節點的序號 ************-1
Q[rear].node_id = rear; //保存當前節點序號
rear++;
}

void DeQueue(int *i,int *j,int *k) //獲取當前節點的序號和對應的迷宮坐標,然后出列
{
*i = Q[front].x;
*j = Q[front].y;
*k = Q[front].node_id;
front++; //出列一個節點
}

bool GetNextPos(int *i ,int *j,int count) //得到下一個鄰接點的位置
{
switch(count)
{
case 1:(*j)++; return 1; //右
case 2:(*i)++; return 1; //下
case 3:(*j)--; return 1; //左
case 4:(*i)--; return 1; //上
default:
return 0;
}
}

void ShortestPath_BFS(int i ,int j) //廣度優先遍歷尋找最短路徑
{
int count,m,n,k;
EnQueue(i,j,-1);
Map[i][j] = 1; //起點入隊,標記起點已走過
while(true)
{
count = 1;
DeQueue(&i,&j,&k);
n = i,m = j;
//保存當前位置
while(GetNextPos(&i,&j,count))
{
count++;
if(!Map[i][j])
{
EnQueue(i,j,k);
Map[i][j] = 1;
if(i == 8 && j == 9)
return; //到達終點(8,9)是默認終點,可以任意修改
}

i = n; j = m; //保證遍歷當前坐標的所有相鄰位置
}
}

}

void ShortestPath()
{
int i,j,k,sum=0;
k = rear-1;
while(k != -1)
{
i = Q[k].x;
j = Q[k].y;
Map[i][j] = 2;
k = Q[k].parent_id;
}
cout<<" 0 1 2 3 4 5 6 7 8 9"<<endl;

for(i = 0;i < 10;i++)
{
cout<<i;
for(j = 0;j < 10;j++)
{
if(Map[i][j]==2)
{sum++; cout<<"□";}
else
cout<<"■";
}
cout<<endl;
}

cout<<"最短路徑長度:"<<sum<<endl;
}

void Print()
{
cout<<" 0 1 2 3 4 5 6 7 8 9"<<endl;
for(int i = 0;i < 10;i++)
{
cout<<i;
for(int j = 0;j < 10;j++)
{
if(Map[i][j])
cout<<"■";
else
cout<<"□";
}
cout<<endl;
}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM