04:城市距離
總時間限制: 1000ms 記憶體限制: 65535kb
描述 某個國家的地圖可以看做是乙個n*m的**,單元格為』#』表示城市區域,單元格為』.』表示耕地區域。連通的』#』表示的區域是同乙個城市。從乙個單元格走到上下左右相鄰的另乙個單元格為一步。現在,你可以選擇在任何乙個城市的任何乙個單元格中,請問你要走到其他的城市中去,最少要走多少步?
輸入
第一行兩個整數n和m。(1<=n,m<=500)
接下來有n行,每行乙個字串,有m個字元,每個字元要麼是』#』,要麼是』.』。
保證地圖中至少有兩個城市。
輸出
最近兩個城市的距離。
樣例輸入
4
4##..
...#
#...
....
樣例輸出
2
思路點拔:由於可以有不止乙個』#』,所以首先需要乙個搜尋,搜尋每
個城市,接著,用第二個搜尋去遍歷每個城市之間的距離,找到最小的距
離即可
法1:
#include
#include
#include
#include
#include
using
namespace
std;
struct node //定義第乙個結構體,儲存每個城市的資訊
;struct dis //定義第二個結構體,儲存城市間的距離
;queue
q1; //有兩個結構體,就有兩個佇列
queue
q2;int n,m;
int dir[4][2]=,,,},ans=int_max,tot=0,map[505][505];
bool flag1[505][505],flag2[505][505],maze[505][505];
void bfs2(int k); //第乙個廣搜,搜尋城市裡
void bfs1(int xx,int yy,int k) //第二個標準廣搜,搜尋城市間的距離}}
bfs2(k); //計算城市間的最短距離
}void bfs2(int k)
else}}
}}int main()
else
//否則就是耕地,就標記為0}}
for(int i=1;i<=n;i++)}}
printf("%d\n",ans); //輸出結果
return
0;}
法2(就是寫乙個判斷越界的函式而已,我就不打那麼多注釋了):
#include
#include
#include
#include
#include
using
namespace
std;
struct node
;struct dis
;queue
q1;queue
q2;int n,m;
int dir[4][2]=,,,},ans=int_max,tot=0,map[505][505];
bool flag1[505][505],flag2[505][505],maze[505][505];
bool inside(int xa,int ya) //判斷是否越界
void bfs2(int k) //算出最短距離
else}}
}}void bfs1(int xx,int yy,int k) //搜尋城市,並將在、城市賦為'1'(標準廣搜)}}
bfs2(k); //計算出城市間的最短距離
}int main()
else}}
for(int i=1;i<=n;i++)}}
printf("%d\n",ans);
return0;}
//本題是雙結構體,雙佇列,雙向搜尋,**量較大,再多梳理梳理
1466 雙向佇列
problem description 想想雙向鍊錶 雙向佇列的定義差不多,也就是說乙個佇列的隊尾同時也是隊首 兩頭都可以做出隊,入隊的操作。現在給你一系列的操作,請輸出最後佇列的狀態 命令格式 lin x x表示乙個整數,命令代表左邊進隊操作 rin x 表示右邊進隊操作 rout 右出佇列 lo...
雙端佇列篇deque SDUT OJ 雙向佇列
time limit 1000ms memory limit 65536k 想想雙向鍊錶 雙向佇列的定義差不多,也就是說乙個佇列的隊尾同時也是隊首 兩頭都可以做出隊,入隊的操作。現在給你一系列的操作,請輸出最後佇列的狀態 命令格式 lin x x表示乙個整數,命令代表左邊進隊操作 rin x 表示右...
51Nod 1275 雙指標 雙端佇列
題目鏈結 題意 給定乙個陣列a aa和乙個整數k kk,問有多少個連續區間的最大值和最小值的差不大於kkk 思路 首先對於固定起點的連續區間,隨著終點的增大,其區間最大值一定非遞減,區間最小值一定非遞增,故區間最大值和最小值的差一定是非遞減的。故可以利用雙指標來快速求出合法區間的個數。但該過程還需要...