标签:
模拟题,即:合并后如果后面有可以合并的则合并 合并前的不算。
这是题目的提示,按照要求做就行。
思路:举例向右划,那么从最右 i 向左扫,扫到一个数若与 i 位置的数相等,则i位置加上该数,继续向左扫,直到结束或者碰到一个数与 i 位置的数不相等。扫完后把数全归到最右端即可。
#include<iostream> #include<stdio.h> #include<math.h> #include<string.h> #include<vector> #include<list> #include<algorithm> using namespace std; int a[5][5]; //把数全移到对应的方向 void arrange_up(){ for(int j=0;j<4;j++){ for(int i=0;i<4;i++){ for(int k=i;k<4;k++){ if(a[k][j]){ if(k!=i){ a[i][j] = a[k][j]; a[k][j] = 0; } break; } } } } } void arrange_down(){ for(int j=0;j<4;j++){ for(int i=3;i>=0;i--){ for(int k=i;k>=0;k--){ if(a[k][j]){ if(k!=i){ a[i][j] = a[k][j]; a[k][j] = 0; } break; } } } } } void arrange_right(){ for(int i=0;i<4;i++){ for(int j=3;j>=0;j--){ for(int k=j;k>=0;k--){ if(a[i][k]){ if(k!=j){ a[i][j] = a[i][k]; a[i][k] = 0; } break; } } } } } void arrange_left(){ for(int i=0;i<4;i++){ for(int j=0;j<4;j++){ for(int k=j;k<4;k++){ if(a[i][k]){ if(k!=j){ a[i][j] = a[i][k]; a[i][k] = 0; } break; } } } } } //输出 void output(){ for(int i=0;i<4;i++){ for(int j=0;j<4;j++){ printf("%5d",a[i][j]); if(j!=3) printf(" "); else printf("\n"); } } } int main(){ int T; scanf("%d",&T); while(T--){ for(int i=0;i<4;i++){ for(int j=0;j<4;j++){ scanf("%d",&a[i][j]); } } int q; scanf("%d",&q); while(q--){ int t; scanf("%d",&t); if(t==1){ //向上 for(int j=0;j<4;j++){ //列 for(int i=0;i<4;i++){ //行 if(a[i][j]){ //从该点开始 for(int k=i+1;k<4;k++){ //向下扫 if(a[i][j]==a[k][j]){ //若相等,则加上 a[i][j] += a[k][j]; a[k][j] = 0; } else if(a[k][j]){ //若有值且不相等 退出 break; } } } } }//整理数字 arrange_up(); } else if(t==2){ //向下 for(int j=0;j<4;j++){ //列 for(int i=3;i>=0;i--){ if(a[i][j]){ for(int k=i-1;k>=0;k--){ if(a[i][j]==a[k][j]){ a[i][j] += a[k][j]; a[k][j] = 0; } else if(a[k][j]){ break; } } } } } arrange_down(); } else if(t==3){ //向左 for(int i=0;i<4;i++){ //行 for(int j=0;j<4;j++){ if(a[i][j]){ for(int k=j+1;k<4;k++){ if(a[i][j]==a[i][k]){ a[i][j] += a[i][k]; a[i][k] = 0; } else if(a[i][k]){ break; } } } } } arrange_left(); } else if(t==4){ //向右 for(int i=0;i<4;i++){ //行 for(int j=3;j>=0;j--){ if(a[i][j]){ for(int k=j-1;k>=0;k--){ if(a[i][j]==a[i][k]){ a[i][j] += a[i][k]; a[i][k] = 0; } else if(a[i][k]){ break; } } } } } arrange_right(); } output(); } } return 0; }
标签:
原文地址:http://blog.csdn.net/woyuhuaijin/article/details/51346760