程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> NYoj-27-水池數目-DFS-BFS

NYoj-27-水池數目-DFS-BFS

編輯:C++入門知識

NYoj-27-水池數目-DFS-BFS


水池數目

時間限制:3000 ms | 內存限制:65535 KB 難度:4
描述
南陽理工學院校園裡有一些小河和一些湖泊,現在,我們把它們通一看成水池,假設有一張我們學校的某處的地圖,這個地圖上僅標識了此處是否是水池,現在,你的任務來了,請用計算機算出該地圖中共有幾個水池。
輸入
第一行輸入一個整數N,表示共有N組測試數據
每一組數據都是先輸入該地圖的行數m(0 輸出
輸出該地圖中水池的個數。
要注意,每個水池的旁邊(上下左右四個位置)如果還是水池的話的話,它們可以看做是同一個水池。
樣例輸入
2
3 4
1 0 0 0 
0 0 1 1
1 1 1 0
5 5
1 1 1 1 0
0 0 1 0 1
0 0 0 0 0
1 1 1 0 0
0 0 1 1 1
樣例輸出
2
3
DFS:
#include
#include
#define N 200
#define M 200
int map[N][M] = {0};
void DFS(int i,int j) 
{    
    if(map[i][j-1]) { map[i][j-1]=0; DFS(i,j-1); } 
    if(map[i][j+1]) { map[i][j+1]=0; DFS(i,j+1); }    
    if(map[i-1][j]) { map[i-1][j]=0; DFS(i-1,j); }    
    if(map[i+1][j]) { map[i+1][j]=0; DFS(i+1,j); }
}
int main()
{    
     int t,n,m;    
     int i,j,count;    
     scanf("%d",&t);    
     while(t--)    
     {        
         scanf("%d %d",&n,&m); 
         count=0;        
         for(i=1;i<=n;i++)            
            for(j=1;j<=m;j++)                
                 scanf("%d",&map[i][j]);        
         for(i=1;i<=n;i++)            
             for(j=1;j<=m;j++)                
                 if(map[i][j])   
                { 
                    count++; 
                    map[i][j]=0; 
                    DFS(i,j); 
                }        
         printf("%d\n",count);   
     }   
return 0;
}  
再看這個:
#include
#include
#define N 200
#define M 200
int map[N][M] = {0};
int f[4][2]={{-1,0},{1,0},{0,1},{0,-1}};
void DFS(int i,int j)
{
	int k;
	map[i][j]=0;
	for(k=0;k<4;k++)
	{
		if(map[i+f[k][0]][j+f[k][1]]==1)
		   DFS(i+f[k][0],j+f[k][1]);
	}
}
int main()
{    
     int t,n,m;    
     int i,j,count;    
     scanf("%d",&t);    
     while(t--)    
     {        
         scanf("%d %d",&n,&m); 
         count=0;        
         for(i=1;i<=n;i++)            
            for(j=1;j<=m;j++)                
                 scanf("%d",&map[i][j]);        
         for(i=1;i<=n;i++)            
             for(j=1;j<=m;j++)                
                 if(map[i][j])   
                { 
                    count++; 
                    map[i][j]=0; 
                    DFS(i,j); 
                }        
         printf("%d\n",count);   
     }   
return 0;
}
BFS:
#include
#include
#include
#include
#define N 200
#define M 200
using namespace std;
int map[N][M] = {0};
int f[4][2]={{-1,0},{1,0},{0,1},{0,-1}};
struct pool
{
	int a,b;
};
queue v;
void BFS(int i,int j)
{
	int k;
	pool p,x,y;
	p.a=i;
	p.b=j;
	v.push(p);
	map[i][j]=0;
	while(!v.empty())
	{
		x=v.front();
		for(k=0;k<4;k++)
		{
			if(map[x.a+f[k][0]][x.b+f[k][1]])
			{
				map[x.a+f[k][0]][x.b+f[k][1]]=0;
				y.a=x.a+f[k][0];
				y.b=x.b+f[k][1];
				v.push(y);
			}
		}
		v.pop();
	}
} 
int main()
{    
     int t,n,m;    
     int i,j,count;    
     scanf("%d",&t);    
     while(t--)    
     {        
         scanf("%d %d",&n,&m); 
         count=0;        
         for(i=1;i<=n;i++)            
            for(j=1;j<=m;j++)                
                 scanf("%d",&map[i][j]);        
         for(i=1;i<=n;i++)            
             for(j=1;j<=m;j++)                
                 if(map[i][j])   
                { 
                    count++; 
                    map[i][j]=0; 
                    BFS(i,j); 
                }        
         printf("%d\n",count);   
     }   
return 0;
}  


  
						

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