字节跳动正式批第二场笔试题2019.8.25

第三题2048

#include
#include
using namespace std;
int G[5][5];
int vis[5][5] = {0};
void print(){
	for(int i = 0; i < 4; i++){
		for(int j = 0; j < 4; j++){
			if(j > 0) cout<<" "; 
			cout<<G[i][j];
		}
		cout<<endl;
	}
} 
int main(){
	int k;
	cin>>k;
	for(int i = 0; i < 4; i++)
		for(int j = 0; j < 4; j++){
			cin >> G[i][j];
		}
	if(k == 1){  //上 
		for(int j = 0; j < 4; j++){ 
			for(int i = 0; i < 4; i++){ //移动 
				if(G[i][j]==0){
					int u = i + 1;
					while(u < 4 && G[u][j]==0) u++;
					if(u < 4){
						swap(G[u][j], G[i][j]);
					}
				}
			}
			for(int i = 1; i < 4; i++){ //合并 
				if(G[i][j] == G[i-1][j] && !vis[i-1][j]){
					G[i-1][j] += G[i][j];
					G[i][j] = 0;
					vis[i-1][j] = 1;
				}
			}
			for(int i = 0; i < 4; i++){ //移动 
				if(G[i][j]==0){
					int u = i + 1;
					while(u < 4 && G[u][j]==0) u++;
					if(u < 4){
						swap(G[u][j], G[i][j]);
					}
				}
			}
		}
		print();
	}else if( k == 2){ //下 
		//大于0的数值移动到底部
		for(int j = 0; j < 4; j++){
			for(int i = 3; i >= 0; i--){ //移动 
				if(G[i][j]==0){
					int u = i - 1;
					while(u >= 0 && G[u][j]==0) u--;
					if(u >= 0){
						swap(G[u][j], G[i][j]);
					}
				}
			}
			//合并
			for(int i = 2; i >= 0; i--){ //合并 
				if(G[i][j] == G[i+1][j] && !vis[i+1][j]){
					G[i+1][j] += G[i][j];
					G[i][j] = 0;
					vis[i+1][j] = 1;
				}
			}
			//移动
			for(int i = 3; i >= 0; i--){ //移动 
				if(G[i][j]==0){
					int u = i - 1;
					while(u >= 0 && G[u][j]==0) u--;
					if(u >= 0){
						swap(G[u][j], G[i][j]);
					}
				}
			}	 
		} 
		print(); 
	}else if( k == 3){  //左 
		for(int i = 0; i < 4; i++){
			for(int j = 0; j < 4; j++){ //移动 
				if(G[i][j]==0){
					int u = j + 1;
					while(u < 4 && G[i][u]==0) u++;
					if(u < 4){
						swap(G[i][u], G[i][j]);
					}
				}
			}
			//合并
			for(int j = 1; j < 4; j++){ //合并 
				if(G[i][j-1] == G[i][j] && !vis[i][j-1]){
					G[i][j-1] += G[i][j];
					G[i][j] = 0;
					vis[i][j-1] = 1;
				}
			}
			for(int j = 0; j < 4; j++){ //移动 
				if(G[i][j]==0){
					int u = j + 1;
					while(u < 4 && G[i][u]==0) u++;
					if(u < 4){
						swap(G[i][u], G[i][j]);
					}
				}
			}	 
		}
		print();
	}else{  //右 
		for(int i = 0; i < 4; i++){
			for(int j = 3; j >= 0; j--){ //移动 
				if(G[i][j]==0){
					int u = j - 1;
					while(u >= 0 && G[i][u]==0) u--;
					if(u >= 0){
						swap(G[i][u], G[i][j]);
					}
				}
			}
			//合并
			for(int j = 2; j >= 0; j--){ //合并 
				if(G[i][j+1] == G[i][j] && !vis[i][j+1]){
					G[i][j+1] += G[i][j];
					G[i][j] = 0;
					vis[i][j+1] = 1;
				}
			}
			for(int j = 3; j >= 0; j--){ //移动 
				if(G[i][j]==0){
					int u = j - 1;
					while(u >= 0 && G[i][u]==0) u--;
					if(u >= 0){
						swap(G[i][u], G[i][j]);
					}
				}
			}
		}
		print();
	}	
	
	
	return 0;
}

你可能感兴趣的:(字节跳动正式批第二场笔试题2019.8.25)