2048

这道题目是Google2015笔试题了最简单的一道了,但是似乎也要考虑清楚情况,

先做一个方向,调好之后其他的只要相应的改就可以了。

如果right的话,需要从后向前递推,因为题目一个比较奇怪的要求,2 2 2 right就会0 2 4, 所以不能left到right直接过来,不然要出错了,只能从后面向前腿,
但是找合并的顺序还是向right。

如果0不做,否则,先往前找最长的0,然后看是否合并,要这个数之前未合并,并且数和当前相等。同时注意右移index越界的情况。然后exit while循环注意分条件。

一开始做的时候还考虑了合并之后的合并,其实是没看清楚题意,一定要审清楚题意再开始写,非常重要,不然简单的题反而想复杂,非常不划算。

#include <cstdio>

int T,n,a[20][20],merge[20][20];
char str[10];
void right()
{
    int start;
    for(int i=0;i<=n-1;i++)
    {
        for(int j=n-2;j>=0;j--)
        {
            if(a[i][j]==0)
                ;
            else
            {
                start=j+1;
                while(start<=n-1 && a[i][start]==0)
                    start++;
                if(start>=n)
                {
                    a[i][n-1]=a[i][j];
                    a[i][j]=0;
                }
                else
                {
                    if(a[i][start]==a[i][j])
                    {
                        if(merge[i][start]==false)
                            a[i][start]*=2,a[i][j]=0,merge[i][start]=true;
                        else
                            a[i][start-1]=a[i][j],a[i][j]=0;
                    }
                    else
                    {
                        if(start!=j+1)//start modified
                            a[i][start-1]=a[i][j],a[i][j]=0;
                    }
                }
            }
        }
    }
}
void left()
{
    int start;
    for(int i=0;i<=n-1;i++)
    {
        for(int j=1;j<=n-1;j++)
        {
            if(a[i][j]==0)
                ;
            else
            {
                start=j-1;
                while(start>=0 && a[i][start]==0)
                    start--;
                if(start<0)
                {
                    a[i][0]=a[i][j];
                    a[i][j]=0;
                }
                else
                {
                    if(a[i][start]==a[i][j])
                    {
                        if(merge[i][start]==false)
                            a[i][start]*=2,a[i][j]=0,merge[i][start]=true;
                        else
                            a[i][start+1]=a[i][j],a[i][j]=0;
                    }
                    else
                    {
                        if(start!=j-1)//start modified
                            a[i][start+1]=a[i][j],a[i][j]=0;
                    }
                }
            }
        }
    }
}
void down()
{
    int start;
    for(int j=0;j<=n-1;j++)
    {
        for(int i=n-2;i>=0;i--)
        {
            if(a[i][j]==0)
                ;
            else
            {
                start=i+1;
                while(start<=n-1 && a[start][j]==0)
                    start++;
                if(start>=n)
                {
                    a[n-1][j]=a[i][j];
                    a[i][j]=0;
                }
                else
                {
                    if(a[start][j]==a[i][j])
                    {
                        if(merge[start][j]==false)
                            a[start][j]*=2,a[i][j]=0,merge[start][j]=true;
                        else
                            a[start-1][j]=a[i][j],a[i][j]=0;
                    }
                    else
                    {
                        if(start!=i+1)//start modified
                            a[start-1][j]=a[i][j],a[i][j]=0;
                    }
                }
            }
        }
    }
}

void up()
{
    int start;
    for(int j=0;j<=n-1;j++)
    {
        for(int i=1;i<=n-1;i++)
        {
            if(a[i][j]==0)
                ;
            else
            {
                start=i-1;
                while(start>=0 && a[start][j]==0)
                    start--;
                if(start<0)
                {
                    a[0][j]=a[i][j];
                    a[i][j]=0;
                }
                else
                {
                    if(a[start][j]==a[i][j])
                    {
                        if(merge[start][j]==false)
                            a[start][j]*=2,a[i][j]=0,merge[start][j]=true;
                        else
                            a[start+1][j]=a[i][j],a[i][j]=0;
                    }
                    else
                    {
                        if(start!=i-1)//start modified
                            a[start+1][j]=a[i][j],a[i][j]=0;
                    }
                }
            }
        }
    }
}

void Show()
{
    for(int i=0;i<n;i++)
    {
        printf("%d",a[i][0]);
        for(int j=1;j<n;j++)
        {
            printf(" %d", a[i][j]);
        }
        puts("");
    }
}
void init()
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
            merge[i][j]=false,scanf("%d",&a[i][j]);
    }
}


int main()
{
    freopen("B-large-practice.in","r",stdin);
    freopen("B-large-practice.out","w",stdout);
    scanf("%d",&T);
    int casei=1;
    while(T--)
    {
        scanf("%d%s",&n,&str);
        init();
        if(str[0]=='r')
        {
            right();
            printf("Case #%d:\n",casei++);
            Show();
        }
        else if(str[0]=='l')
        {
            left();
            printf("Case #%d:\n",casei++);
            Show();
        }
        else if(str[0]=='d')
        {
            down();
            printf("Case #%d:\n",casei++);
            Show();
        }
        else if(str[0]=='u')
        {
            up();
            printf("Case #%d:\n",casei++);
            Show();
        }
    }
    return 0;
}

附上一位童鞋的代码 http://blog.csdn.net/xhu_eternalcc/article/details/38667641

Posted by richard爱闹 - 8月 21 2014
如需转载,请注明: 本文来自 Richard