HDU 1547(Bubble Shooter)

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int MAXN = 105;

int R, C;
char mp[MAXN][MAXN]; //地圖
int s[MAXN * MAXN];
int dir[2][6][2] = //搜索方向
{
    {{0,-1},{0,1},{-1,0},{1,0},{-1,1},{1,1} },  //偶數行:左 右 左上 左下 右上 右下
    {{0,-1},{0,1},{-1,-1},{1,-1},{-1,0},{1,0} } //奇數行:左 右 左上 左下 右上 右下
};

//廣搜,flag=true表示消除新球的同色球,flag=false表示消除相連的所有球
int BFS(bool flag, int sr, int sc)
{
    memset(s, 0, sizeof(s));
    queue<int> q;
    q.push(sr * C + sc);
    char ch = mp[sr][sc];
    mp[sr][sc] = 'E';
    int sum = 0;
    s[sum++] = sr * C + sc;
    while (!q.empty())
    {
        int pos = q.front();
        q.pop();
        int r = pos / C, c = pos % C;
        for (int i = 0; i < 6; i++)
        {
            int nr = r + dir[(r + 1) % 2][i][0], nc = c + dir[(r + 1) % 2][i][1];
            if (nr < 0 || nr >= R || nc < 0 || nc >= C - nr % 2 || mp[nr][nc] == 'E') 
                continue;
            if (flag && mp[nr][nc] != ch)
                continue;
            mp[nr][nc] = 'E';
            q.push(nr * C + nc);
            s[sum++] = nr * C + nc;
        }
    }
    if (flag && sum < 3)
    {
        for (int i = 0; i < sum; i++)
            mp[s[i] / C][s[i] % C] = ch;
    }
    return sum;
}

int main()
{
    int sr, sc;
    while (cin >> R >> C >> sr >> sc)
    {
        memset(mp, 0, sizeof(mp));
        --sr; --sc;
        for (int i = 0; i < R; i++)
        {
            cin >> mp[i];
        }

        int total = 0; //初始總球數
        for (int i = 0; i < R; i++)
        {
            for (int j = 0; mp[i][j]; j++)
            {
                if (mp[i][j] >= 'a' && mp[i][j] <= 'z')
                    ++total;
            }
        }

        BFS(true, sr, sc);
        int ans = 0;
        for (int j = 0; j < C; j++)
        {
            if (mp[0][j] != 'E')
                ans += BFS(false, 0, j);
        }
        cout << total - ans << endl;
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章