POJ3984 迷宮問題【BFS】

好長時間沒有敲過代碼了,感覺之前學過的都忘了,趁著這個暑假,打算把之前學習的東西都復習一下,當然得慢慢來,畢竟好長時間不敲代碼了,怎么著都有些生疏,再加上之前學的也不咋地,相當于回爐重造吧,見笑見笑。

POJ 3984

題目:

Description

定義一個二維數組:?

int maze[5][5] = {

0, 1, 0, 0, 0,

0, 1, 0, 1, 0,

0, 0, 0, 0, 0,

0, 1, 1, 1, 0,

0, 0, 0, 1, 0,

};

它表示一個迷宮,其中的1表示墻壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求編程序找出從左上角到右下角的最短路線。
Input

一個5 × 5的二維數組,表示一個迷宮。數據保證有唯一解。
Output

左上角到右下角的最短路徑,格式如樣例所示。
Sample Input

0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
Sample Output

(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)


bfs的方法用來求最短路徑是十分好用的,方法也十分簡單,可以參考深度優先搜索(DFS)詳解,這里邊的解釋挺詳細的。
這個題我也是參考的別的同學的,具體方法簡單易懂,在這我就不贅述了。
大體思路是
從左上角(0, 0)位置開始,上下左右進行搜索,可以定義一個方向數組,代表上下左右四個方向,使用方向數組,可以使一個點上下左右移動。對于數組中的每個元素用結構體來存儲,除了有x,y成員外,還要定義pre成員,用來表示從左上角到右下角的最短路徑中每個元素的前一個元素的下標,即保存路徑,方便后面的輸出。通過廣度搜索借助隊列進行操作,當中要注意1.搜索的元素是否在迷宮內;2.是否可行(其中1是墻壁不能走,0可以走)。我們可以把已走過的路標記為1,這樣能保證路徑最短(因為廣度優先搜索,只會離初始點的步數一步步增多。如果之后發現遇到了已走過的點,那肯定是從之前已走過的點那邊走最短,而不是從之后發現的點走最短啊),直到搜索到右下角(4, 4),問題就解決了。輸出路徑即可。
#include <iostream>
#define Qsize 50
using namespace std;
int a[5][5];
int dis[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
struct Node{int x,y,pre;
}queue[Qsize];
int front=0;
int rear=0;
int visit[5][5];
void bfs(int beginX,int beginY,int endX,int endY){queue[0].x=beginX,queue[0].y=beginY,queue[0].pre=-1;rear=rear+1;visit[beginX][beginY]=1;while(front<rear){for(int i=0;i<4;i++){int newx=queue[front].x+dis[i][0];int newy=queue[front].y+dis[i][1];if(newx<0||newx>5||newy<0||newy>5||a[newx][newy]==1||visit[newx][newy]==1)continue;queue[rear].x=newx;queue[rear].y=newy;queue[rear].pre=front;rear++;visit[newx][newy]=1;if(newx==endX&&newy==endY)return;}front++;}
}
void print(Node now){if(now.pre==-1)cout<<"("<<now.x<<", "<<now.y<<")"<<endl;else{print(queue[now.pre]);cout<<"("<<now.x<<", "<<now.y<<")"<<endl;}
}
int main()
{for(int i=0;i<5;i++){for(int j=0;j<5;j++)cin>>a[i][j];}bfs(0,0,4,4);print(queue[rear-1]);return 0;
}



本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/536174.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536174.shtml
英文地址,請注明出處:http://en.pswp.cn/news/536174.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

宏定義基本用法

宏定義 不帶參數 宏定義又稱為宏代換、宏替換&#xff0c;簡稱“宏”。 格式&#xff1a; #define 標識符 字符串其中的標識符就是所謂的符號常量&#xff0c;也稱為“宏名”。 預處理&#xff08;預編譯&#xff09;工作也叫做宏展開&#xff1a;將宏名替換為字符串。 掌…

廣度優先搜索練習之神奇的電梯

廣度優先搜索練習之神奇的電梯 Time Limit: 1000ms Memory limit: 65536K 題目描述 有一座已知層數為n的高樓&#xff0c;這座高樓的特殊之處在于只能靠電梯去上下樓&#xff0c;所以要去到某一層要非常耽誤時間&#xff0c;然而更悲哀的是&#xff0c;這座高樓的電梯是限號…

ubuntu安裝proxychains及自動補全

proxychains ProxyChains是本人目前為止用到的最方便的代理工具。 inux下代理一般是通過http_proxy和https_proxy這兩個環境變量&#xff0c;但是很多軟件并不使用這兩個變量&#xff0c;導致流量無法走代理。在不使用vpn的前提下&#xff0c;linux并沒有轉發所有流量的真全局…

快速冪講解

快速冪的目的就是做到快速求冪&#xff0c;假設我們要求a^b,按照樸素算法就是把a連乘b次&#xff0c;這樣一來時間復雜度是O(b)也即是O(n)級別&#xff0c;快速冪能做到O(logn)&#xff0c;快了好多好多。它的原理如下&#xff1a; 假設我們要求a^b&#xff0c;那么其實b是可以…

如何查詢資料

如何查詢資料技術資料及問題查詢查詢方法分類查找提取關鍵字GitHub項目優先使用Google搜索引擎Copy Paste論文查找詢問主管 測試修改使用總結分享 公司信息查詢國內公司國外公司 如何查詢資料 技術資料及問題查詢 查詢方法 資料與解決辦法的查詢大致分為7大類。 1.分類查…

山東省第八屆 ACM 省賽 sum of power(SDUT 3899)

Problem Description Calculate ∑ni1im mod (10000000007) for given n&#xff0c;m. Input Input contains two integers n,m(1≤n≤1000,0≤m≤10). Output Output the answer in a single line. Example Input 10 0 Example Output 10 方法&#xff1a;快速冪和大數求和 …

Ubuntu主題更換

Ubuntu主題更換 目前的Ubuntu有Unity和Gnome兩個比較流行的版本&#xff0c;以下為Gnome桌面環境的主題更換&#xff0c;其他桌面環境類似。 主題的下載地址&#xff0c;點擊 Theme 將在網絡上下載的主題文件進行解壓&#xff0c;然后拷貝到 /usr/share/themes/ 目錄下&…

awk簡單使用

awk 用于在linux/unix下對文本和數據進行處理,支持用戶自定義函數和動態正則表達式等先進功能。 命令格式&#xff1a; awk BEGIN{ print “start” } pattern { commend } END{print "end"} file awk "BEGIN{ print “start” } pattern { commend } END{pr…

Ubuntu 14.04 下 Virtual Judge 的搭建

前期準備工作 1.1 一個Linux系統 因為現場賽的緣故&#xff0c;我一直使用的都是ubuntu。 這里我測試用的是Ubuntu14.04 Desktop 64bit ,當然選擇Server會更好一些. 系統的安裝不再贅述&#xff0c;作為服務器請選用Server版本。1.2 更新源 在搭建環境之前&#xff0c;請確保…

BitMap的原理介紹與實現

BitMap 位圖&#xff08;bitmap&#xff09;是一種非常常用的結構&#xff0c;在索引&#xff0c;數據壓縮等方面有廣泛應用。位圖是通過將數組下標與應用中的一些值關聯映射&#xff0c;數組中該下標所指定的位置上的元素可以用來標識應用中值的情況&#xff08;是否存在或者數…

MySQL與PHP連接

1、mysql_connect()-建立數據庫連接 格式&#xff1a; resource mysql_connect([string hostname [:port] [:/path/to/socket] [, string username] [, string password]]) 例&#xff1a; $conn mysql_connect("localhost", "username", "pa…

QML Profiler性能優化教程

QML Profiler 2018年1月26日 vincent 對于一個程序的開發&#xff0c;性能優化是開發中的一個重要步驟。 我們肯定不希望開發出來的程序表現出卡頓&#xff0c;最好是處處流暢&#xff0c;絲滑般的體驗。 對于C程序&#xff0c;我們有很多方法可以做性能優化&#xff0c;例如…

uburntu在不能自動獲取網絡時的聯網設置

一&#xff1a;網絡基礎配置 1. eth0設置不正確&#xff0c;導致無法正常啟動&#xff0c;修改eth0配置文件就好 ubuntu 12.04的網絡設置文件是/etc/network/interfaces&#xff0c;打開文件&#xff0c;會看到 auto lo iface lo inet loopback 這邊的設置是本地回路。在后…

計算機顯卡知識普及

顯卡知識普及 一、什么是顯卡&#xff1f; 顯示接口卡&#xff08;Video card&#xff0c;Graphics card&#xff09;、顯示器配置卡簡稱為顯卡&#xff0c;是個人電腦基本組成部分之一。 用途是將計算機系統所需要的顯示信息進行轉換驅動&#xff0c;并向顯示器提供信號&…

整除的尾數

Problem Description 一個整數&#xff0c;只知道前幾位&#xff0c;不知道末二位&#xff0c;被另一個整數除盡了&#xff0c;那么該數的末二位該是什么呢&#xff1f; Input 輸入數據有若干組&#xff0c;每組數據包含二個整數a&#xff0c;b(0<10000,10<b<100)&…

QML 控件大全

QML TypeContainerDelayButtonDialDialogButtonBoxDialogDrawerMenuMenuBarOverlayPageIndicatorRangeSliderScrollViewSpinBoxStackViewSwipeViewSwitchTabBarToolBarToolSeparatorToolTipTumbler QML Type 本篇主要介紹QtQuick Controls 2,Qt Creator 5.10 1.Container im…

斐波那契的整除

Description 已知斐波那契數列有如下遞歸定義&#xff0c;f(1)1,f(2)1, 且n>3,f(n)f(n-1)f(n-2)&#xff0c;它的前幾項可以表示為1&#xff0c; 1&#xff0c;2 &#xff0c;3 &#xff0c;5 &#xff0c;8&#xff0c;13&#xff0c;21&#xff0c;34…&#xff0c;現在的…

Qt與QML的枚舉綁定(C++枚舉)

Qt到QML的枚舉綁定 QML中是不支持c的枚舉類型的&#xff0c;所以我們可以使用Qt的元對象系統&#xff0c;即MOS,來幫助我們實現。 進行綁定的好處就是&#xff0c;以后數據發生變化的時候&#xff0c;就是枚舉發生增加修改&#xff0c;添加等的時候&#xff0c;不需要在QML中…

深入理解Qt的.pro文件

深入理解Qt的pro文件模板變量生成目錄生成的應用程序名編譯選項目標文件目錄包含頭文件包含源文件包含資源文件附加頭文件包含鏈接庫預編譯宏平臺相關性處理指定來自ui文件位置指定界面翻譯文本列表指定圖標 深入理解Qt的.pro文件 一般Qt項目我們是使用Qt Creator自動生成的&…

Ubuntu 用vsftpd 配置FTP服務器

最近開學&#xff0c;有好多課程結束后都需要將文件考到優盤里&#xff0c;而本人又有健忘的毛病&#xff0c;經常忘記帶優盤&#xff0c;所以就搭建了自己的ftp服務器&#xff0c;也算是用技術放松自己吧。閑話少敘&#xff0c;進入正題&#xff1a; 網上關于ftp搭建的文章很…