IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> AcWing 674.超级2048 -> 正文阅读

[数据结构与算法]AcWing 674.超级2048

题目链接:674. 超级2048 - AcWing题库

2048?是一个著名的单人游戏,其目标是在网格上滑动图块以组合它们并创建数字为 2048?的图块。

2048?在一个简单的 4×4?网格上进行游戏,其中有一些图块,玩家可以对它们进行移动。

每一步操作,玩家可以选择向左,向右,向上和向下?4?个方向去移动所有图块。

如果两个包含数字相同的图块在移动时发生碰撞,则它们将合并为一个图块,该图块上的数值为两个图块的数字之和。

在一次操作中,一个新创建的图块不能再次参与合并,并且图块们总是优先沿着移动方向与其旁边的图块进行合并。

例如,如果三个?2?在一行构成?2 2 2,这时玩家选择向左移动,则它将变为?4 2 0,最左边的两个?22?会被合并。

untitled.png

上图显示了当玩家将所有图块“右移”时4×4?网格的变化情况。

爱丽丝和鲍勃非常喜爱这个游戏。

但是几轮后,他们觉得网格的尺寸太小了并不刺激,所以决定将网格的尺寸扩大到?N×NN×N,他们称之为“超级 2048”游戏。

但是难度的激增让他们无法驾驭这个游戏。

他们要求你编写一个程序来帮助他们弄清楚在所有图块沿着某个特定方向移动后网格的样子。

输入格式

第一行包含整数?T,表示共有?T?组测试数据。

每组数据第一行包含整数?N?和一个字符串DIR,其中?N?表示网格的尺寸,DIR?表示图块的移动方向,DIR?将会是以下四个字符串中的一个:left,?right,?up,?down

接下来?N?行,每行包含?N?个整数,用来描述网格的初始状态,每个整数表示网格中一个图块的值,如果为?00?则表示该位置是空的。

输出格式

对于每组测试数据,第一行输出?Case #x:,其中?xx?为组别编号(从?1?开始)。

然后输出?N?行,每行?N?个空格隔开的整数,表示图块移动后网格的样子。

数据范围

1≤T≤100
1≤N≤20
网格中的每个数字都是?0?或?2?到?1024?之间的?2?的整数次幂,包括?2?和 1024。

输入样例:

3
4 right
2 0 2 4
2 0 4 2
2 2 4 8
2 2 4 4
10 up
2 0 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0
3 right
2 2 2
4 4 4
8 8 8

输出样例:

Case #1:
0 0 4 4
0 2 4 2
0 4 4 8
0 0 4 8
Case #2:
4 0 0 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
Case #3:
0 2 4
0 4 8
0 8 16

代码打卡:

#include <bits/stdc++.h>
using namespace std;

const int N = 30;
int arr[N][N];

void getUp(int n);
void getDown(int n);
void getLeft(int n);
void getRight(int n);

int main() {
    int t;cin >> t;
    for (int t1 = 1;t1 <= t;t1 ++) {
        int n;string str;
        cin >> n >> str;
        
        for (int i = 0;i < n;i ++) 
            for (int j = 0;j < n;j ++) cin >> arr[i][j];
        
        if (str == "up") getUp(n);
        if (str == "down") getDown(n);
        if (str == "left") getLeft(n);
        if (str == "right") getRight(n);
        
        cout << "Case #" << t1 << ":" << endl;
        for (int i = 0;i < n;i ++) {
            for (int j = 0;j < n;j ++) cout << arr[i][j] << ' ';
            cout << endl;
        }
    }
    return 0;
}

void getUp(int n){
    for (int i = 0;i < n;i ++) { // 遍历每一列
        int idx = 0;
        
        for (int j = 0;j < n;j ++) {
            if (arr[j][i] == 0) continue; // j => 行号
            
            if (j + 1 >= n) {
                arr[idx ++][i] = arr[j][i];
                continue;
            }
            
            int k = j + 1;
            
            while (k < n && arr[k][i] == 0) k ++;
            
            if (arr[j][i] == arr[k][i]) {
                arr[idx ++][i] = 2 * arr[j][i];
                j = k;
            }
            else arr[idx ++][i] = arr[j][i];
        }
        
        for (int j = idx;j < n;j ++) arr[j][i] = 0;
    }
}

void getDown(int n){
    for (int i = 0;i < n;i ++) { // 遍历每一列
        int idx = n - 1;
        
        for (int j = n - 1;j >= 0;j --) {
            if (arr[j][i] == 0) continue; // j => 行号
            
            if (j - 1 < 0) {
                arr[idx --][i] = arr[j][i];
                continue;
            }
            
            int k = j - 1;
            
            while (k >= 0 && arr[k][i] == 0) k --;
            
            if (arr[j][i] == arr[k][i]) {
                arr[idx --][i] = 2 * arr[j][i];
                j = k;
            }
            else arr[idx --][i] = arr[j][i];
        }
        
        for (int j = idx;j >= 0;j --) arr[j][i] = 0;
    }
}

void getLeft(int n){
    for (int i = 0;i < n;i ++) {
        int idx = 0;
        for (int j = 0;j < n;j ++) {
            if (arr[i][j] == 0) continue;
            
            if (j + 1 >= n) {
                arr[i][idx ++] = arr[i][j];
                continue;
            }
            
            int k = j + 1;
            
            while (k < n && arr[i][k] == 0) k ++;
            
            if (arr[i][j] == arr[i][k]) {
                arr[i][idx ++] = 2 * arr[i][k];
                j = k;
            }
            else arr[i][idx ++] = arr[i][j];
        }
        
        for (int j = idx;j < n;j ++) arr[i][j] = 0;
    }
}

void getRight(int n){
    for (int i = 0;i < n;i ++) {
        int idx = n - 1;
        for (int j = idx;j >= 0;j --) {
            if (arr[i][j] == 0) continue;
            
            if (j - 1 < 0) {
                arr[i][idx --] = arr[i][j];
                continue;
            }
            
            int k = j - 1;
            
            while (k >= 0 && arr[i][k] == 0) k --;
            
            if (arr[i][j] == arr[i][k]) {
                arr[i][idx --] = 2 * arr[i][k];
                j = k;
            }
            else arr[i][idx --] = arr[i][j];
        }
        
        for (int j = idx;j >= 0;j --) arr[i][j] = 0;
    }
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-30 12:11:23  更:2021-09-30 12:12:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:27:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码