模拟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;
}
时间: 2024-07-28 22:06:13

模拟2048(nyoj 1187)的相关文章

nyoj 1187 模拟2048 (模拟题)

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=1187 模拟2048 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 单机手游2048的时代已经过去了,不过闲来无事的LN最近就是在写这个程序. 当然,这种事情他也希望大家能够参与其中. 那么问题来了,给你一个类比的2048 并告诉你方向,你能得出操作后的结果么? 输入 t组测试数据. 4*4的数据,类比游戏 q次询问. 1.2.3.4依次代表上.下.左.右

android 模拟2048

利用节日休息时间在ANDROID上进行学习并模拟2048游戏. 效果如下图: 制作思路: 1.画出2048游戏主界面,根据手机屏幕宽高度进行计算并画出每个方块的大小. 1 @Override 2 protected void onSizeChanged(int w, int h, int oldw, int oldh) { 3 super.onSizeChanged(w, h, oldw, oldh); 4 int cW = (Math.min(w, h) - 10) / 4; 5 6 addC

NYOJ 179 LK&#39;s problem (排序模拟)

链接:click here~~ 题意: 描述 LK has a question.Coule you help her? It is the beginning of the day at a bank, and a crowd  of clients is already waiting for the entrance door to  open. Once the bank opens, no more clients arrive, and  tellerCount tellers be

NYOJ 2356: 哈希计划【模拟】

题目描述 众所周知,LLM的算法之所以菜,就是因为成天打游戏,最近LLM突然想玩<金庸群侠传X>,结果进去后各种被虐,LLM就开始研究这个游戏的代码,顺便还学会了一点点点点lua语言,然后就开始了伟大的改游戏代码之旅,然后LLM发现自己too young了,这个游戏把所有的文本都进行了哈希,如果自己改了代码或者剧情文本的话它哈希出来的值就会和原来的哈希值不一样......然后游戏就会打不开.....,现在LLM发现了文本的哈希函数,要求你写个程序,功能为: 输入一段字符串,输出一个哈希值 为了

NYOJ 2356 哈希计划(模拟)

题目链接: http://acm.nyist.me/JudgeOnline/problem.php?id=2356 题目描述 众所周知,LLM的算法之所以菜,就是因为成天打游戏,最近LLM突然想玩<金庸群侠传X>,结果进去后各种被虐,LLM就开始研究这个游戏的代码,顺便还学会了一点点点点lua语言,然后就开始了伟大的改游戏代码之旅,然后LLM发现自己too young了,这个游戏把所有的文本都进行了哈希,如果自己改了代码或者剧情文本的话它哈希出来的值就会和原来的哈希值不一样......然后游戏

NYOJ 52 无聊的小明 【模拟】

无聊的小明 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述       这天小明十分无聊,没有事做,但不甘于无聊的小明聪明的想到一个解决无聊的办法,因为他突然对数的正整数次幂产生了兴趣. 众所周知,2的正整数次幂最后一位数总是不断的在重复2,4,8,6,2,4,8,6--我们说2的正整数次幂最后一位的循环长度是4(实际上4的倍数都可以说是循环长度,但我们只考虑最小的循环长度).类似的,其余的数字的正整数次幂最后一位数也有类似的循环现象. 这时小明的问题就出来了:是不

NYOJ 1253 Turing equation【题意是关键,模拟】

Turing equation 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 描述 The fight goes on, whether to store  numbers starting with their most significant digit or their least  significant digit. Sometimes  this  is also called  the  "Endian War". The battlegroun

NYOJ 220 (红黑树--模拟)

链接:click here 题意:题目其实很简单,绕一大圈,原来就是叫你输出输出中序遍历,Orz~~~红黑树经过旋转后中序遍历其实是不变的,所以与下面的旋转没有关系~~--- _ --. 思路:直接数组模拟,或用结构体:包含(数据域,左子树,右子树) 代码: #include <iostream> #include <stdio.h> #include <string.h> #include <vector> #include <algorithm&g

nyoj 弹球II(数学 模拟)

弹球II 时间限制:1000 ms  |  内存限制:65535 KB 描述 游戏厅里有一种很常见的游戏机,里面有很多根管子有规律地排成许多行.小球从最上面掉下去,碰到管子会等概率地往管子左边或者右边的空隙掉下去.不过在最靠边的小球只会往一边掉(如图,灰色小球只可能掉到右边空隙).现在已知共2 * n - 1行管子,第i行有Ai个管子,如果i是奇数,那么Ai等于m,如果i是偶数,Ai等于m - 1.小球从第1行第k个管子右边掉下去,要求小球从最后一行各个出口掉出来的概率. 输入 第一行是一个整数