HDU 4775 Infinite Go 解题报告

题目

题意:

在一个有上、左边界,无右、下边界的棋盘上下棋,如果一片同颜色的棋子周围(只考虑横纵的四个格子)都是边界或者敌方的棋子,则它们会被消去。A、B两人轮流下棋,如果一方下了一个棋子使得有棋子要被消去时,先消敌方的,消完敌方后再看是否要消去己方。已知下棋的位置,求最后剩的棋子个数。

题解:

用map存下每个棋子的位置,就可以预处理棋子之间的邻接关系。然后依次下棋,遇到同色的棋子则用并查集合并,并记录该集合周围空格的个数。

为方便空格的个数如此定义:

#*

##

如果#是白棋,*表示没有棋子,那么空格个数是2。

如果一片棋子周围没有空格了,则消去。


代码:


//Time:78ms
//Memory:1104KB
//Length:3344B
#include 
#include 
#include 
#include 
#include 
using namespace std;
#define MAXN 10010
#define MP(x,y) make_pair(x,y)
#define FI first
#define SE second
map,int>ma;
const int dis[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
struct _no
{
    int x,y,c;
    int to[4];
    _no(int _x,int _y)
    {
        x=_x,y=_y;
        c=-1;
        for(int i=0;i<4;++i)    to[i]=-1;
    }
    _no(){}
}no[MAXN];
int top,fa[MAXN],col[MAXN],xy[MAXN];
int que[MAXN];
bool vi[MAXN];
int findfa(int n)
{
    if(fa[n]!=n)
        fa[n]=findfa(fa[n]);
    return fa[n];
}
inline void smu(int a,int b)
{
    a=findfa(a),b=findfa(b);
    if(a==b)    return ;
    fa[b]=a;
    col[a]+=col[b];
}
void del(int h)
{
    int he=0,ta=0;
    que[ta++]=h;
    while(he,int> ::iterator ite=ma.find(MP(tx,ty));
                if(ite!=ma.end())
                    no[i].to[j]=ite->SE;
            }
        for(int i=0;i0&&ty>0&&(no[p].to[j]==-1||no[no[p].to[j]].c==-1))
                    ++col[p];
            }
            for(int j=0;j<4;++j)
            {
                int tmp=no[p].to[j];
                if(tmp!=-1&&no[tmp].c!=-1)
                {
                    --col[findfa(tmp)];
                    if(no[tmp].c==c)
                        smu(tmp,p);
                }
            }
            for(int j=0;j<4;++j)
            {
                int tmp=no[p].to[j];
                if(tmp!=-1&&no[tmp].c==!c&&col[findfa(tmp)]==0)
                    del(tmp);
            }
            for(int j=0;j<4;++j)
            {
                int tmp=no[p].to[j];
                if(tmp!=-1&&no[tmp].c==c&&col[findfa(tmp)]==0)
                    del(tmp);
            }
            if(no[p].c!=-1&&col[findfa(p)]==0)   del(p);
        }
        int nb=0,nw=0;
        for(int i=0;i


你可能感兴趣的:(数据结构,中等)