輸入一個圖,
計算 '@' 有多少個連接區塊,
只要兩個'@'相鄰或在斜對角就算連接。
--------------------------------------------------
方法:
先用迴圈找出'@',
再用DFS去找相連接的 '@' ,
每連接一個就將其字元改掉,避免重複連接,
DFS做完後,
這樣再繼續迴圈找下一個'@'可以保證不與上一個'@'在同一區塊,
因為上一個'@'所有跟他相連的區塊都被改掉了,
所以可以放心地++
--------------------------------------------------
/* 20150822
* hanting
* UVa 572 - Oil Deposits
* C++
*/
#include <iostream>
#include <cstring>//memset
using namespace std;
const int maxn=100+5;
int grid[maxn][maxn];
void DFS(int i,int j)
{
grid[i][j]=2;
if(grid[i][j+1]==1)//Right
{
DFS(i,j+1);
}
if(grid[i+1][j]==1)//Down
{
DFS(i+1,j);
}
if(grid[i][j-1]==1)//Left
{
DFS(i,j-1);
}
if(grid[i-1][j]==1)//Up
{
DFS(i-1,j);
}
if(grid[i-1][j-1]==1)//Left-Up
{
DFS(i-1,j-1);
}
if(grid[i-1][j+1]==1)//Right-Up
{
DFS(i-1,j+1);
}
if(grid[i+1][j-1]==1)//Left-Down
{
DFS(i+1,j-1);
}
if(grid[i+1][j+1]==1)//Right-Down
{
DFS(i+1,j+1);
}
}
int main()
{
int row,col;
while(cin>>row>>col and row+col)
{
memset(grid,0,sizeof(grid));
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
char ch;
cin>>ch;
grid[i][j]=(ch=='@' ? 1:0);
}
}
int ans=0;
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
if(grid[i][j]==1)
{
DFS(i,j);
ans++;
}
}
}
cout<<ans<<endl;
}
return 0;
}
沒有留言:
張貼留言