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

來源:互聯網
上載者:User

標籤:test   _id   一個   ace   goto   ase   node   調整   nod   

#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; 

}

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.