BFS廣搜例題,問題引入 --- 阿狗荒島逃生系列(其一)

該例題來自我的學長,感謝學長們對我的帶領:

例題簡述:

 

代碼及詳細註釋:

 

 

#include<bits/stdc++.h>
using namespace std;

struct Node{
int x,y;
};

int n,m;
int Map[31][31];//用來存圖;
int vis[31][31];//在搜索父點的四個方向時用來防止某個方向走過;
int sum; //用來記錄島的大小;

void BFS(Node start){
queue<Node> q;
//在這裏用二維數組表示4個方向
int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
//把起點加入隊列
q.push(start);
//判空,q爲空時q.empty()返回1(true),否則返回0(false);
while(!q.empty()){
//取隊首元素進行擴展;
Node t=q.front();
//彈出隊首元素;
q.pop();
//四個方向遍歷;
for(int i=0;i<4;i++){
//定義一個now結構體來存當前方向的座標;
Node now;
now.x=t.x+dir[i][0];//t.x爲父點,循環不斷的 進行,dir[i][0]分別爲:0,1,0,-1;
now.y=t.y+dir[i][1];// t.y爲父點,循環不斷的 進行,dir[i][1]分別爲:1,0,-1,0;
//下一步如果是海,跳過;
if(now.x<0 || now.x>n-1 || now.y<0 || now.y>m-1)
continue;
//開始時在主函數中vis已經被初始化爲零了;
//如果vis爲零(沒有走過)並且當前位置爲1(若不是海)執行裏面的語句;
if(!vis[now.x][now.y] && Map[now.x][now.y]==1){
//把該位置用vis標記爲1(標記爲走過),
vis[now.x][now.y]=1;
//將該位置入隊;
q.push(now);
//sum加1,記錄陸地的面積;
sum++;
}
}
}
}

int main(){
//定義一個s結構體用來記錄阿狗掉落的位置(起始點);
Node s;
//輸入島的尺寸;
while(cin>>n>>m){
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
//存圖;
cin>>Map[i][j];
//輸入阿狗掉落的地點(起始點)
cin>>s.x>>s.y;
//海的地方用零來表示,故,掉落地點爲零即開始就掉水裏了;
if(Map[s.x][s.y]==0)
cout<<"阿狗掉到水裏了,悲劇 ~ \n";
//把vis數組(用來判斷重複道路的數組)初始化;
memset(vis,0,sizeof(vis));
//用sum來記錄島的面積,初始化爲零;
sum=0;
//把掉落點傳到 BFS函數裏;
BFS(s);
//輸出島的面積;
cout<<sum<<"\n";
}
return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章