1. 程式人生 > >C++ 找出迷宮的最短路徑

C++ 找出迷宮的最短路徑

現有一個迷宮0為可以通過的路徑,1為不能通過的路徑

輸入n行m列的一個0、1陣列,找出能通過的最短路徑

原創地址:http://blog.csdn.net/cannel_2020/article/details/7495875

#include<iostream>  
#include<queue>  
#include<string>  
using namespace std;
struct point {
	int x;
	int y;
	point *last;//上一步的座標  
};
int main() {
	while (1) {
		int row, col, i, j;
		cout << "請輸入迷宮圖的行數和列數:";
		cin >> row >> col;
		int **a = new int*[row + 2];
		for (i = 0; i < row + 2; ++i) {
			a[i] = new int[col + 2];
		}
		cout << "請輸入迷宮圖(1代表牆壁,0代表通路):" << endl;
		for (i = 1; i < row + 1; ++i) {
			for (j = 1; j < col + 1; ++j) {
				cin >> a[i][j];
			}
		}
		for (i = 0; i < col + 2; ++i) {//加牆  
			a[0][i] = 1;
			a[row + 1][i] = 1;
		}
		for (i = 1; i < row + 1; ++i) {//加牆  
			a[i][0] = 1;
			a[i][col + 1] = 1;
		}
		queue<point*> q;
		point *start = new point;//起點  
		cout << "請輸入起點座標(範圍1,1到" << row << "," << col << "):";
		cin >> start->x >> start->y;
		start->last = start;
		q.push(start);


		a[start->x][start->y] = 2;


		point end;//終點  
		cout << "請輸入終點座標(範圍1,1到" << row << "," << col << "):";
		cin >> end.x >> end.y;
		int aspect[4][2] = { { 0, -1 },{ 0, 1 },{ -1, 0 },{ 1, 0 } };//轉向:上下左右  
		int flag = 0;//是否有路可走的標誌  
		while (!q.empty()) {
			point *front = q.front();
			q.pop();//彈出隊頭  
			if (front->x == end.x && front->y == end.y) {
				flag = 1;
				cout << "成功找到出路." << "最少需要" << a[front->x][front->y] - 2 << "步。如下所示:" << endl;
				a[front->x][front->y] = -6;
				//cout<<"倒退回去:"<<(front)->x<<","<<(front)->y;  
				point *lastPoint = front;
				front = front->last;
				while ((front->x != start->x) || (front->y != start->y)) {
					//cout<<"->"<<front->x<<","<<front->y;  
					if (lastPoint->x - front->x == 1) {
						a[front->x][front->y] = -1;
					}
					else if (lastPoint->x - front->x == -1) {
						a[front->x][front->y] = -2;
					}
					else if (lastPoint->y - front->y == 1) {
						a[front->x][front->y] = -3;
					}
					else {
						a[front->x][front->y] = -4;
					}
					lastPoint = front;
					front = front->last;
				}
				//cout<<"->"<<start->x<<","<<start->y<<endl;  
				a[start->x][start->y] = -5;
				break;


			}
			else {
				for (int i = 0; i < 4; ++i) {
					point *temp = new point;
					temp->x = front->x + aspect[i][0];
					temp->y = front->y + aspect[i][1];
					if (a[temp->x][temp->y] == 0) {
						temp->last = front;
						q.push(temp);
						a[temp->x][temp->y] = a[front->x][front->y] + 1;
					}
				}
			}
		}
		if (!flag)
			cout << "無路可走!" << endl;
		else {
			for (int i = 1; i <= row; ++i) {
				for (int j = 1; j <= col; ++j) {
					if (a[i][j] <0 ) {
						cout << "(" << i << "," << j << ")";
					}					
				}
				cout << endl;
			}
		}
		system("pause");
	}
}


相關推薦

C++ 迷宮路徑

現有一個迷宮0為可以通過的路徑,1為不能通過的路徑 輸入n行m列的一個0、1陣列,找出能通過的最短路徑 原創地址:http://blog.csdn.net/cannel_2020/article/details/7495875 #include<iostream>

迷宮路徑【佇列+回溯】

       求迷宮的最短路徑(0表示通路,1表示受阻) 問題:有一個迷宮,求從入口到出口的最短路徑,其中0表示通路,1表示受阻,規定向下是X軸,向右是Y軸 輸入:第一個數迷宮x軸的長度,第二個數迷宮y軸的長度,緊接著入口點的座標和出口的座標,之後

bfs poj3984 迷宮路徑且輸出路徑

題意: 定義一個二維陣列:  int maze[5][5] = {     0, 1, 0, 0, 0,     0, 1, 0, 1, 0,     0, 0, 0, 0, 0,

迷宮路徑問題解析

有一個二維陣列,0表示路,-1表示牆,求其中任意兩點的最短路徑。 我們先看,怎麼求一條路徑:求兩點路徑是一個數據結構上的典型的迷宮問題,很多資料結構的書上都有介紹,解決辦法如下: 從一點開始出發,向四個方向查詢,每走一步,把走過的點的值+1(即本節點值+1),防止重複行走,並把走過的點壓入堆疊

BFS和DFS的差別,BFS實現迷宮路徑

BFS能夠求得最短路徑,因為BFS每進行一次相當於當前的路徑長度。對於一個N*N矩陣,BFS最多執行n*n次。 深度優先搜尋相當於一個人在走迷宮,廣搜相當於是無窮人沿著不同方向走(因為每條路都同時有人走)。 DFS相當於是一個下壓棧。是先進後出的原則(如

BFS+優先佇列——迷宮路徑——兩種優方法比較及詳細圖解

http://blog.csdn.net/qq_36523667/article/details/78638354 這個連結裡是一道迷宮題。用到了BFS+優先佇列。 我一直百思不得其解優先佇列到底優先在哪了?我感覺和直接bfs沒啥區別?後來證明做法不一樣,思路也不一樣。

Sicily. 迷宮路徑

Time Limit: 1sec    Memory Limit:256MB Description 有一個矩形迷宮,入口和出口都確定為唯一的,且分佈在矩形的不同邊上。 現在讓你算出最短需要走多少步,才可以從入口走到出口。 Input 共N+1行,第一行為

迷宮路徑長度bfs

#include<stdio.h> #include<iostream> using namespace std; struct note { int x;//橫座標 int y;//縱座標 int f;//父親在佇列中的編號,用於求輸出路

資料結構::迷宮(二)--棧的一個應用(求迷宮路徑

      上篇文章我們知道求解迷宮通路的方法,但是一個迷宮有時是不止一條出路,在這些出路中,我們如何找到最短的那一條,這就是我今天要說的迷宮最短路徑問題。 (此處使用的圖): 【先來分析有什麼解決方案:】 1、方法一:我們如果採用上章中遞迴的方式,將所走的路用2標記起來

迷宮路徑dfs和bfs程式碼分析

dfs用遞迴一步步試探,在所有路徑中選出最短的一條路徑 程式碼: //0是路,1是牆 #include<iostream> #include<algorithm> using

用BFS解決迷宮路徑問題

迷宮問題中,有很大一部分可以用BFS來解。解決這類問題可以很大地提升能力與技巧,這篇文章是基於一個簡單例項展開來講的例題: 第一行兩個整數n, m,為迷宮的長寬。 接下來n行,每行m個數為0或1中的一個。0表示這個格子可以通過,1表示不可以。假設你現在已經在迷宮座標(1,1)

迷宮路徑演算法(使用佇列)

    順便也把圖裡求迷宮最短路徑演算法貼出來,主要思想是利用佇列,採用廣度優先搜尋法,當第一次出現目的點時,中斷搜尋,並輸出路徑。程式還是主要使用的C語言,對於佇列操作我又重寫了下基本操作程式碼比如入隊、出隊等,沒辦法對C++不熟啊!!   個人認為需要說明的是:   

關於棧與遞迴求解迷宮迷宮路徑問題

一、棧實現迷宮問題: 問題描述:用一個二維陣列模擬迷宮,其中1為牆,0為通路,用棧方法判斷迷宮是否有出口,下圖為簡單模擬的迷宮: 思想: 1.首先給出入口點,如上圖入口點座標為{2,0}; 2.從入口點出發,在其上下左右四個方向試探,若為通路(值為0)時,則向前走,並將每

迷宮路徑問題(BFS)

別人部落格上看到的一道題:給定一個大小為N*M的迷宮,由通道(‘.’)和牆壁(‘#’)組成,其中通道S表示起點,通道G表示終點,每一步移動可以達到上下左右中不是牆壁的位置。試求出起點到終點的最小步數。(本題假定迷宮是有解的)(N,M<=100) 原地址:

BFS迷宮路徑模板

oid pop print ios int pair 出口 最短路 bfs #include<iostream> #include<queue> #define INF 65535 using namespace std; int vis

【深度優先_棧】:輸出迷宮的所有路徑,並求路徑長度及路徑

//要求輸出迷宮的所有路徑,並求出最短路徑長度及最短路徑。 //入口座標設為(1,1),出口座標設為(4,4) #include<stdio.h> #define M 4 //行數 #define N 4 //列數 #define MaxSiz

自動尋找走迷宮路徑

演算法心得:1.利用廣度優先遍歷(bfs)實現尋找最短路徑2.利用樹的思想,將每走一步的終點與它的起點相連線,這樣就能在最後把整條最短路徑找出來#include<stdio.h> #include<stdlib.h> #include<time.

求地鐵站路徑以及打印所有的路徑

oid 多條 dijk 開始 turn 未使用 sta 第一個 pan 拓展dijkstra算法,實現利用vector存儲多條路徑: #include <iostream> #include <vector> #include <stack&

路徑算法 (一)——求路徑長度 (*^__^*) 嘻嘻……

沒有 str -1 man 最大 連線 問題 輸入 sha 【問題描述】: 平面上有n(n<=100)個點,每個點的坐標均在-10000~10000之間。 其中的一些點之間有連線。若有連線,則表示可以從一個點到

淺入淺數據結構(24)——路徑問題

簡單的 如何 指向 生效 解決 src 簡寫 關鍵字 單源最短路徑   上一篇博文我們提到了圖的最短路徑問題:兩個頂點間的最短路徑該如何尋找?其實這個問題不應該叫“最短”路徑問題,而應該叫“最便宜”路徑問題,因為有時候我們會為圖中的邊賦權(weight),也叫權重,相當於經