1. 程式人生 > >迷宮最短路徑長度bfs

迷宮最短路徑長度bfs

#include<stdio.h>
#include<iostream>
using namespace std;
struct note
{
	int x;//橫座標
	int y;//縱座標
	int f;//父親在佇列中的編號,用於求輸出路徑
	int s;//走的步數 
};
struct note que[2051];
int i,j,k,n,m,startx,starty,p,q,ty,tx,flag;
int a[51][51],book[51][51];
int next[4][2]={{0,1},
				{1,0},
				{0,-1},
				{-1,0}};
/*
如果是八個方向的情況: int next[10][2]={{0,1},
                                       {1,0},
                                       {0,-1},
                                       {-1,0},
                                       {-1,1},
                                       {1,1},
                                       {0,-1}
                                       {1,-1}};
        for(k=0;k<=7;k++)
        {
            //計算下一個點座標
             tx=que[head].x+next[k][0];
             ty=que[head].y+next[k][1];        
*/
 void print(int i){  
        if(que[i].f!=-1){  
            print(que[i].f);  
            cout<<"("<<que[i].x<<","<<" "<<que[i].y<<")"<<endl;  
        }  
    }  
void bfs()
{
	//佇列初始化
	int head=1;
	int tail=1;
	//往佇列插入迷宮的入口座標
	que[tail].x=startx;
	que[tail].y=starty;
	que[tail].f=-1;
	que[tail].s=0;
	tail++;
	book[startx][starty]=1;
	flag=0;//用來標記是否到達目的地,0表示沒有
	while(head<tail)//當佇列不為空時候 
	{
		//列舉四個方向(注意方向陣列的設定和for迴圈的遍歷,通用模板)
		for(k=0;k<=3;k++)
		{
			//計算下一個點座標
		     tx=que[head].x+next[k][0];
			 ty=que[head].y+next[k][1];
			 //判斷是否越界
			 if(tx<1||tx>n||ty<1||ty>n)
			 	continue;
			//判斷是否是障礙物或者已經在路徑中
			if(a[tx][ty]==0&&book[tx][ty]==0)
			{
				//把這個點標記為已經走過
				//注意寬頻搜尋每個點只能入佇列一次 ,和dfs不同,所以book的值不需要恢復為0;
				book[tx][ty]=1;
				//插入新的點到佇列中
				que[tail].x =tx;
				que[tail].y=ty;
				que[tail].f=head;//因為這個點是從head擴展出來的,所以他的父親是head,由於本題不要求路徑,因此本句話可以省略
			    que[tail].s=que[head].s+1;
				tail++; 
			 } 
			 //如果到了目的地,停止擴充套件,任務結束,退出迴圈
			 if(tx==p&&ty==q)
			 {
			 	//注意這兩句話千萬位置不能顛倒
				 flag=1;
				  cout<<"(1, 1)"<<endl;  
				 print(head); 
				 break;	 
			  } 
			  
		 } 
		 if(flag==1)
		 	break;
		 head++;//這個地方千萬不能忘記,當一個點擴充套件結束後,head++才能使得後面的點再進行擴充套件 
	 } 
	 //列印佇列中末尾最後一個點的步數
	 //注意tail是指向隊尾的下一個位置,所以需要-1
	 cout<<que[tail-1].s; 	 	
 } 
int main()
{
	cin>>n>>m;
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
			cin>>a[i][j];
	cin>>startx>>starty>>p>>q;
	bfs();
	 return 0;

 } 


相關推薦

迷宮路徑長度bfs

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

bfs poj3984 迷宮路徑且輸出路徑

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

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

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

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

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

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

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

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

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

BFS解決迷宮路徑問題

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

迷宮路徑BFS演算法

給定一個大小為N*M的迷宮,由通道('.')和牆壁('#')組成,其中通道S表示起點,通道G表示終點,每一步移動可以達到上下左右中不是牆壁的位置。試求出起點到終點的最小步數。(本題假定迷宮是有解的)(N,M<=100) 樣例輸入: 10 10 樣例輸出: 22 這

迷宮路徑問題(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

【轉】求路徑長度--簡單易懂

最短路徑 href 弗洛伊德算法 clas 路徑 div bsp -- ref 求任意兩個節點之間的最短路徑長度(只給出路徑長度,不能求出路過的節點): 傻子也能看懂的弗洛伊德算法(轉) 求一個節點到其他節點的最短路徑長度: 傻子也能看懂的迪傑斯特拉算法(轉)【轉】求最短

迷宮路徑【佇列+回溯】

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

CF1076D Edge Deletion 路徑樹+bfs

題目描述 You are given an undirected connected weighted graph consisting of n n n vertices and m m m edges. Let's denote the length of the shortest path from

迷宮路徑問題解析

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

有關無權圖單源路徑BFS實現

對於一個帶權圖,我們想有效的求解最短路徑,往往會選擇dijkstra演算法,但是對於一個無權圖,我們只需要考慮其他頂點距離源點的最少數目的路徑即可,因此這裡可以採用BFS來實現。演算法具體步驟1. 用dist表示頂點距離源點的距離,首先將所有頂點的dist初始化為無窮大2.

「圖論」路徑長度-Dijkstra

Dijkstra(迪傑斯特拉)演算法是典型的最短路徑路由演算法,用於計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。Dijkstra演算法能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。   Dij

Sicily. 迷宮路徑

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

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

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

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

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

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

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