模拟2048(nyoj 1187)

模拟题,
提示
此题为2048加强版:
如 有一行为 32 16 16 0 则向右结果为 0 0 0 64 向左结果为 32 32 0 0 。

即:合并后如果后面有可以合并的则合并 合并前的不算。

这是题目的提示,按照要求做就行。

思路:举例向右划,那么从最右 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;
}


你可能感兴趣的:(模拟)