2015年8月22日 星期六

[UVA] 572 - Oil Deposits

題意:
輸入一個圖,
計算 '@' 有多少個連接區塊,
只要兩個'@'相鄰或在斜對角就算連接。

--------------------------------------------------

方法:
先用迴圈找出'@',
再用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;
}

沒有留言:

張貼留言