方格游戏

来源:互联网 发布:云计算的基础是什么 编辑:程序博客网 时间:2024/04/16 22:39
给定一N×M的方阵,初始时每一块都有红绿蓝中的一
种颜色。
现在每次我们会选择一块最大的,相同时最靠左的,
再相同时最靠下的一个相同颜色的四联通块消除,得到
(联通块大小-2)2的分数,因此大小至少为2才能消除。
若某一块下面有空格,则该块会下落,若某一列左侧
为空列,则该列会整体左移。
若能将所有的方格消完,会得到1000分的奖励。
若无法消除,游戏结束。

现在希望能得到每一个步骤及得分

输入文件(Game.in)
第一行两个数N M
接下来是N行M列的RGB方阵
输出文件(Game.out)
输出若干行
若能够消除,输出左下角坐标及消除的球数
若游戏结束,输出最终得分及剩余球数
样例输入
3 3
RRR
GGG

BBB
样例输出
1 1 3
1 1 3
1 1 3
1003 0
数据范围
对于30%的数据 N M ≤3
对于100%的数据 N M≤20

#include <iostream>#include <cstring>#include <algorithm>#include <cmath>#include <cstdio>#include <queue>#include <vector>#include <stack>using namespace std;char st[1000][1000];int save[1000][1000];int n,m;int dx[]={1,0,0,-1};int dy[]={0,1,-1,0};int vis[1000][1000];int sum[1000];int score;void print(){    for(int i=1;i<=n;i++)    {        for(int j=1;j<=m;j++)        {            printf("%d ",save[i][j]);        }        printf("\n");    }    system("pause");}void dfs(int x,int y,int col){    int xx,yy;    vis[x][y]=col;    sum[col]++;    for(int i=0;i<4;i++)    {        xx=x+dx[i];        yy=y+dy[i];        if(xx<1||xx>n) continue;        if(yy<1||yy>m) continue;        if(vis[xx][yy]) continue;        if(save[x][y]==save[xx][yy])        {            dfs(xx,yy,col);        }    }}vector<int>ax,ay,as;int total;void change(){    vector<int>stv;    for(int i=1;i<=m;i++)    {        stv.clear();        for(int j=1;j<=n;j++)        {            if(save[j][i])            {                stv.push_back(save[j][i]);            }        }        int j;        for(j=0;j<stv.size();j++)        {            save[j+1][i]=stv[j];        }        for(j=stv.size()+1;j<=n;j++)        {            save[j][i]=0;        }    }    int times;    for(int i=1;i<=m;i++)    {        int sum=0;        times=0;        while(sum==0)        {            times++;            if(times>n)                break;            for(int j=1;j<=n;j++)            {                sum+=save[j][i];            }            if(sum) break;            int tmp;            for(int j=1;j<=n;j++)            {                for(int k=i;k<=m;k++)                {                    save[j][k]=save[j][k+1];                }            }        }    }}bool check(){    int num=0;    memset(vis,0,sizeof(vis));    memset(sum,0,sizeof(sum));    int flag=1;    int maxn=-1;    int x,y;    for(int j=1;j<=m;j++)    {        for(int i=1;i<=n;i++)        {            if(!vis[i][j]&&save[i][j])            {                num++;                dfs(i,j,num);                if(sum[num]>maxn)                {                    maxn=sum[num];                    flag=num;                    x=i;                    y=j;                }            }        }    }    if(maxn<2)    {        return false;    }    else    {        printf("%d %d %d\n",x,y,maxn);        score+=(maxn-2)*(maxn-2);        total-=sum[flag];        for(int i=1;i<=n;i++)        {            for(int j=1;j<=m;j++)            {                if(vis[i][j]==flag)                {                    save[i][j]=0;                }            }        }    }    return 1;}int main(){    //freopen("game.in","r",stdin);    //freopen("game.out","w",stdout);    scanf("%d%d",&n,&m);    total=n*m;    for(int i=n;i>=1;i--)    {        scanf("%s",st[i]+1);        for(int j=1;j<=m;j++)        {            if(st[i][j]=='R')            {                save[i][j]=1;            }            if(st[i][j]=='B')            {                save[i][j]=2;            }            if(st[i][j]=='G')            {                save[i][j]=3;            }        }    }    while(check())    {        change();    }    if(total==0)    {        score+=1000;    }    printf("%d %d\n",score,total);    return 0;}/*10 15RGGBBGGRBRRGGBGRBGRBGRBGRBGRBGRRRRGBBBRGGRBBBGGRGBGGBRRGGGBGGBGGRRRRRBGGRRRBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRGGGGRRRRRGGGGGGGGGGGGGGG*/


0 0
原创粉丝点击