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