程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU/HDOJ 1241 Oil Deposits (DFS)深度優先搜索

HDU/HDOJ 1241 Oil Deposits (DFS)深度優先搜索

編輯:C++入門知識

題意:相當於求圖中連通子圖的個數,這裡的連通按照題意要求為 八鄰域連通(上,下,左,右,四個對角)

思路:深度優先,依次搜索圖中每個點的八鄰域,並注意標記訪問,不然後果很嚴重.

AC 代碼:46MS 416K 速度不慢,可能對於圖中障礙比較多的緣故。


[cpp] 
#include <iostream>  
#include <string>  
#include <cstdio>  
#include <cmath>  
#include <vector>  
#include <algorithm>  
#include <sstream>  
#include <cstdlib>  
#include <fstream>  
#include <queue>  
using namespace std; 
bool visit[110][110]; //重復訪問控制   
char maze[110][110];  //地圖   
int dir[8][2]={{-1,0},{1,0},{0,1},{0,-1},{-1,-1},{-1,1},{1,-1},{1,1}};//八個方向   
int sum,m,n,sx,sy; 
bool isbound(int a,int b){  //判斷邊界   
    if(a<1 || a>m || b<1 || b>n)return true; 
    return false; 

void dfs(int sx,int sy){  //對每一個點進行深搜   
     
     
    for(int i=0;i<8;i++) 
    { 
        if(maze[sx+dir[i][0]][sy+dir[i][1]]=='*')continue;//障礙返回   
        if(isbound(sx+dir[i][0],sy+dir[i][1]))continue;//邊界返回   
        if(visit[sx+dir[i][0]][sy+dir[i][1]])continue;//已訪問,返回   
         
        visit[sx+dir[i][0]][sy+dir[i][1]]=1; //標記已訪問,防止重復訪問   
        dfs(sx+dir[i][0],sy+dir[i][1]); 
     
    } 

int main() 

    while(cin>>m>>n) 
    { 
        if(m==0)break; 
        memset(visit,0,sizeof(visit)); 
        for(int i=1;i<=m;i++){ 
            for(int j=1;j<=n;j++){ 
                cin>>maze[i][j]; 
            } 
        } 
        sum=0; 
        for(int i=1;i<=m;i++){      //對每一個點進行深搜的條件是:  
                                   //1:不是障礙,2:沒有被訪問過   
            for(int j=1;j<=n;j++){ 
                if(maze[i][j]=='@'&& !visit[i][j]){visit[i][j]=1; dfs(i,j);sum++;} 
            } 
        } 
        cout<<sum<<endl; 
         
    } 
 
    return 0; 
 

 
  

#include <iostream>
#include <string>
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
#include <sstream>
#include <cstdlib>
#include <fstream>
#include <queue>
using namespace std;
bool visit[110][110]; //重復訪問控制
char maze[110][110];  //地圖
int dir[8][2]={{-1,0},{1,0},{0,1},{0,-1},{-1,-1},{-1,1},{1,-1},{1,1}};//八個方向
int sum,m,n,sx,sy;
bool isbound(int a,int b){  //判斷邊界
 if(a<1 || a>m || b<1 || b>n)return true;
 return false;
}
void dfs(int sx,int sy){  //對每一個點進行深搜
 
 
 for(int i=0;i<8;i++)
 {
  if(maze[sx+dir[i][0]][sy+dir[i][1]]=='*')continue;//障礙返回
  if(isbound(sx+dir[i][0],sy+dir[i][1]))continue;//邊界返回
  if(visit[sx+dir[i][0]][sy+dir[i][1]])continue;//已訪問,返回
  
  visit[sx+dir[i][0]][sy+dir[i][1]]=1; //標記已訪問,防止重復訪問
  dfs(sx+dir[i][0],sy+dir[i][1]);
 
 }
}
int main()
{
 while(cin>>m>>n)
 {
  if(m==0)break;
  memset(visit,0,sizeof(visit));
  for(int i=1;i<=m;i++){
   for(int j=1;j<=n;j++){
    cin>>maze[i][j];
   }
  }
  sum=0;
  for(int i=1;i<=m;i++){      //對每一個點進行深搜的條件是:
                             //1:不是障礙,2:沒有被訪問過
   for(int j=1;j<=n;j++){
    if(maze[i][j]=='@'&& !visit[i][j]){visit[i][j]=1; dfs(i,j);sum++;}
   }
  }
  cout<<sum<<endl;
  
 }

 return 0;

}

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved