标签:
模拟题,即:合并后如果后面有可以合并的则合并 合并前的不算。
这是题目的提示,按照要求做就行。
思路:举例向右划,那么从最右 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