程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU/HDOJ 1312 Red and Black 非常簡單的搜索題 BFS

HDU/HDOJ 1312 Red and Black 非常簡單的搜索題 BFS

編輯:C++入門知識

題目很好懂,只搜索能到達的地方,統計數量,啥也不做。很坑爹的地方是,行列輸入是反的!

AC代碼:31MS 364K,空間還可以優化,直接不用開visit數組,直接把訪問後的點置為障礙即可。


[cpp] 
#include <iostream>  
#include <string>  
#include <cstdio>  
#include <cmath>  
#include <vector>  
#include <algorithm>  
#include <sstream>  
#include <cstdlib>  
#include <fstream>  
#include <queue>  
using namespace std; 
struct node1{ 
    int x,y; 
}start,p,q; 
 
queue<node1> Q; 
 
bool visit[20][20]; 
char maze[20][20]; 
int dir[4][2] = {-1, 0, 0, 1, 1, 0, 0, -1};//shang,右,xia,左   
int m,n,cnt; 
bool isbond(node1 &a){ 
    if(a.x<0 || a.x>=m || a.y<0 || a.y>=n || maze[a.x][a.y]=='#')return 1; 
    return 0; 

int bfs() 

    while(!Q.empty())Q.pop(); 
    cnt=1; 
    memset(visit,0,sizeof(visit)); 
    Q.push(start); 
    visit[start.x][start.y]=1; 
     
    while(!Q.empty()) 
    { 
        p=Q.front(); 
        Q.pop(); 
        for(int i=0;i<4;i++) 
        { 
            q.x=p.x+dir[i][0]; 
            q.y=p.y+dir[i][1]; 
             
            if(isbond(q))continue; 
            if(visit[q.x][q.y])continue; 
             
            cnt++; 
            visit[q.x][q.y]=1; 
            Q.push(q); 
             
        } 
         
    } 
    return cnt; 
     

 
int main() 

    //ifstream fin;  
    //fin.open("data1.txt");  
 
    while(cin>>n>>m) 
    { 
        if(m==0&&n==0)break; 
        for(int i=0;i<m;i++){ 
            for(int j=0;j<n;j++){ 
                cin>>maze[i][j]; 
                if(maze[i][j]=='@'){ 
                    start.x=i; 
                    start.y=j; 
                } 
                 
            } 
        } 
        cout<<bfs()<<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;
struct node1{
 int x,y;
}start,p,q;

queue<node1> Q;

bool visit[20][20];
char maze[20][20];
int dir[4][2] = {-1, 0, 0, 1, 1, 0, 0, -1};//shang,右,xia,左
int m,n,cnt;
bool isbond(node1 &a){
 if(a.x<0 || a.x>=m || a.y<0 || a.y>=n || maze[a.x][a.y]=='#')return 1;
 return 0;
}
int bfs()
{
 while(!Q.empty())Q.pop();
 cnt=1;
 memset(visit,0,sizeof(visit));
 Q.push(start);
 visit[start.x][start.y]=1;
 
 while(!Q.empty())
 {
  p=Q.front();
  Q.pop();
  for(int i=0;i<4;i++)
  {
   q.x=p.x+dir[i][0];
   q.y=p.y+dir[i][1];
   
   if(isbond(q))continue;
   if(visit[q.x][q.y])continue;
   
   cnt++;
   visit[q.x][q.y]=1;
   Q.push(q);
   
  }
  
 }
 return cnt;
 
}

int main()
{
 //ifstream fin;
 //fin.open("data1.txt");

 while(cin>>n>>m)
 {
  if(m==0&&n==0)break;
  for(int i=0;i<m;i++){
   for(int j=0;j<n;j++){
    cin>>maze[i][j];
    if(maze[i][j]=='@'){
     start.x=i;
     start.y=j;
    }
    
   }
  }
  cout<<bfs()<<endl;
 }
 
 return 0;

}

 

 

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