POJ 1027 The Same Game

84 篇文章 0 订阅
47 篇文章 0 订阅

题目大意:

在一个10x15的方阵里填满了RGB三种小球,要求:

1、找到最大的一片相同颜色区域,并删掉,(这片区域相同颜色球必须相邻,且相邻数大于1)。

2、删除完成后,其他小球自然下落填充。先每列向下填充,空的列由右边一列平移补全。

3、当区域内没有球或最大相邻区域的个数为一,游戏结束。


模拟加BFS,很简单,下面是代码:

#include <stdio.h>
#include <string.h>
char m[10][16];
bool vist[10][15];
struct node
{
    int x,y;
};
void Refresh()
{
    bool vis[15]= {0};
    int i,j;
    for(j=0; j<15; j++)
    {
        bool flag=false;
        int pi=-1;
        for(i=0; i<10; i++)
        {
            if(m[i][j])
            {
                flag=true;
                if(pi!=-1)
                {
                    m[pi][j]=m[i][j];
                    m[i][j]=0;
                    i=pi;
                    pi=-1;
                }
            }
            else
            {
                pi=i;
                while(i+1<10 && !m[i+1][j])
                {
                    i++;
                }
            }
        }
        if(!flag)
        {
            vis[j]=true;
        }
    }
    int k=-1;
    for(j=0; j<15; j++)
    {
        if(!vis[j])
        {
            if(k!=-1)
            {
                for(int x=0; x<10; x++)
                {
                    m[x][k]=m[x][j];
                    m[x][j]=0;
                }
                vis[j]=true;
                j=k;
                k=-1;
            }
        }
        else
        {
            k=j;
            while(j+1<15 && vis[j+1])
            {
                j++;
            }
        }
    }
    return;
}
int maxs=-1;
char C;
int x,y;
int BFS(int i,int j)
{
    struct node qu[151];
    int head=0,tail=0;
    qu[tail].x=i;
    qu[tail].y=j;
    tail++;
    vist[i][j]=true;
    int size1=0;
    char color=m[i][j];
    while(head<tail)
    {
        int x=qu[head].x;
        int y=qu[head].y;
        head++;
        size1++;

        if(x+1<10 && !vist[x+1][y] && m[x+1][y]==color)
        {
            vist[x+1][y]=true;
            qu[tail].x=x+1;
            qu[tail].y=y;
            tail++;
        }
        if(x-1>=0 && !vist[x-1][y] && m[x-1][y]==color)
        {
            vist[x-1][y]=true;
            qu[tail].x=x-1;
            qu[tail].y=y;
            tail++;
        }
        if(y-1>=0 && !vist[x][y-1] && m[x][y-1]==color)
        {
            vist[x][y-1]=true;
            qu[tail].x=x;
            qu[tail].y=y-1;
            tail++;
        }
        if(y+1<15 && !vist[x][y+1] && m[x][y+1]==color)
        {
            vist[x][y+1]=true;
            qu[tail].x=x;
            qu[tail].y=y+1;
            tail++;
        }
    }
    return size1;
}
void Search()
{
    memset(vist,false,sizeof(vist));
    maxs=0;
    for(int j=0; j<15; j++)
        for(int i=0; i<10; i++)
        {
            int size1=0;
            if(!vist[i][j] && m[i][j])
            {
                size1=BFS(i,j);
                if(maxs<size1)
                {
                    maxs=size1;
                    x=i;
                    y=j;
                }
            }
        }
    return;
}
void Del(void)
{
    struct node qu[151];
    int head=0,tail=0;
    qu[tail].x=x;
    qu[tail].y=y;
    tail++;
    C=m[x][y];
    m[x][y]=0;
    while(head<tail)
    {
        int x=qu[head].x;
        int y=qu[head].y;
        head++;
        m[x][y]=0;

        if(x+1<10 && m[x+1][y]==C)
        {
            m[x+1][y]=0;
            qu[tail].x=x+1;
            qu[tail].y=y;
            tail++;
        }
        if(x-1>=0 && m[x-1][y]==C)
        {
            m[x-1][y]=0;
            qu[tail].x=x-1;
            qu[tail].y=y;
            tail++;
        }
        if(y-1>=0 && m[x][y-1]==C)
        {
            m[x][y-1]=0;
            qu[tail].x=x;
            qu[tail].y=y-1;
            tail++;
        }
        if(y+1<15 && m[x][y+1]==C )
        {
            m[x][y+1]=0;
            qu[tail].x=x;
            qu[tail].y=y+1;
            tail++;
        }
    }
    return;
}
int main()
{
    int T,i,cnt=0;
    scanf("%d",&T);
    while(T--)
    {
        cnt++;
        for(i=9; i>=0; i--)
        {
            scanf("%s",m[i]);
        }
        int step=0;
        int ballnum=150;
        int Score=0;
        printf("Game %d: \n\n",cnt);
        while(1)
        {
            maxs=-1;
            Search();
            if(maxs==0 || maxs==1)
            {
                break;
            }
            Del();
            Refresh();
            int score=(maxs-2)*(maxs-2);
            printf("Move %d at (%d,%d): removed %d balls of color %c, got %d points.\n",step+1,x+1,y+1,maxs,C,score);
            ballnum-=maxs;
            Score+=score;
            step++;
        }
        if(ballnum==0)
        {
            Score+=1000;
        }
        printf("Final score: %d, with %d balls remaining.\n\n",Score,ballnum);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值