方法一:
#include <stdio.h>
#include <math.h>
#include <string.h>
int main(){
int n,k,v;
scanf("%d",&n);
for(int i=0;i<n;i++){
int a[4]={0},b[4]={0};
scanf("%d %d %d %d",&a[0],&a[1],&a[2],&a[3]);
k=3;
for(int j=3;j>=0;j--){
if(a[j]!=0){
b[k--]=a[j];
}
}
memset(a, 0, sizeof(a));
v=3;
if(b[2]==b[3]){
a[v--]=2*b[3];
if(b[0]==b[1]){ // 2 2 2 2
a[v--]=2*b[1];
}
}
else if(b[2]==b[1]){ // 0 2 2 4 -> 0 0 4 4
a[v--]=b[3];
a[v--]=2*b[2];
a[v--]=b[0];
}
else if (b[0]==b[1]){ // 2 2 4 8
a[v--]=b[3];
a[v--]=b[2];
a[v--]=2*b[1];
}
else{
a[v--]=b[3];
a[v--]=b[2];
a[v--]=b[1];
a[v--]=b[0];
}
for(int j=0;j<4;j++){
if(j==0)
printf("%d",a[j]);
else
printf(" %d",a[j]);
}
printf("\n");
}
return 0;
}
方法二:
#include <stdio.h>
#include <math.h>
#include <string.h>
int main(){
int n,k;
scanf("%d",&n);
while(n--){
int a[4]={0};
scanf("%d %d %d %d",&a[0],&a[1],&a[2],&a[3]);
for(int i=3;i>0;i--){ //从右边开始
if(a[i]==a[i-1]){ //遇到连续位置相同的则相加到右边数字,左边数字清0
a[i]*=2;
a[i-1]=0;
}
}
k=3; //将中间的0清除
for(int i=3;i>=0;i--){
if(a[i]!=0){
a[k--]=a[i];
}
}
for (int j=k; j>=0; j--) { 左边剩下的位置补0
a[j]=0;
}
printf("%d %d %d %d\n",a[0],a[1],a[2],a[3]);
}
return 0;
}
提示:
第一天下午写的方法一的代码,一直过不去,以为这个笨方法太蠢,导致我过不去。于是第二天写了方法二的代码,发现也过不去。
这两个段代码结果应该是正确的,但是此题的oj更新后,无法通过答案,包括之前别人AC成功的代码也WA。