• CCF CSP 201512-2 消除类游戏


    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址

    CCF CSP 201512-2 消除类游戏

    问题描述

      消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有nm列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这些棋子都被消除。当有多处可以被消除时,这些地方的棋子将同时被消除。
      现在给你一个nm列的棋盘,棋盘中的每一个方格上有一个棋子,请给出经过一次消除后的棋盘。
      请注意:一个棋子可能在某一行和某一列同时被消除。

    输入格式

      输入的第一行包含两个整数nm,用空格分隔,分别表示棋盘的行数和列数。
      接下来n行,每行m个整数,用空格分隔,分别表示每一个方格中的棋子的颜色。颜色使用1至9编号。

    输出格式

      输出n行,每行m个整数,相邻的整数之间使用一个空格分隔,表示经过一次消除后的棋盘。如果一个方格中的棋子被消除,则对应的方格输出0,否则输出棋子的颜色编号。

    样例输入

    4 5
    2 2 3 1 2
    3 4 5 1 4
    2 3 2 1 3
    2 2 2 4 4

    样例输出

    2 2 3 0 2
    3 4 5 0 4
    2 3 2 0 3
    0 0 0 4 4

    样例说明

      棋盘中第4列的1和第4行的2可以被消除,其他的方格中的棋子均保留。

    样例输入

    4 5
    2 2 3 1 2
    3 1 1 1 1
    2 3 2 1 3
    2 2 3 3 3

    样例输出

    2 2 3 0 2
    3 0 0 0 0
    2 3 2 0 3
    2 2 0 0 0

    样例说明

      棋盘中所有的1以及最后一行的3可以被同时消除,其他的方格中的棋子均保留。

    评测用例规模与约定

      所有的评测用例满足:1 ≤ nm ≤ 30。

    解析

    由于一个位置可能同时被一行消除或者被一列消除,故不能直接在原棋盘中操作。

    代码中建立了一个remove二维数组,标识一个位置是否需要消除。

    消除某一行时,统计棋子左侧出现同色棋子的个数。在遇到新颜色棋子时时,如果之前的颜色出现超过三次,则进行消除。

    代码

    C++

    #include <stdio.h>
    
    int main() {
        int board[31][31] = {0};
        bool remove[31][31] = {0};
        int N, M;
        scanf("%d%d", &N, &M);
        for(int n=0; n<N; n++) {
            for(int m=0; m<M; m++) {
                scanf("%d", &board[n][m]);
            }
        }
        int color;
        int cnt;
        for(int n=0; n<N; n++) {
            color = board[n][0];
            cnt = 1;
            for(int m=1; m<=M; m++) {
                if(board[n][m]==color) {
                    cnt++;
                }
                else {
                    if(cnt>=3) {
                        while(cnt) {
                            remove[n][m-cnt] = true;
                            cnt--;
                        }
                    }
                    color = board[n][m];
                    cnt = 1;
                }
            }
        }
        for(int m=0; m<M; m++) {
            color = board[0][m];
            cnt = 1;
            for(int n=1; n<=N; n++) {
                if(board[n][m]==color) {
                    cnt++;
                }
                else {
                    if(cnt>=3) {
                        while(cnt) {
                            remove[n-cnt][m] = true;
                            cnt--;
                        }
                    }
                    color = board[n][m];
                    cnt = 1;
                }
            }
        }
        for(int n=0; n<N; n++) {
            for(int m=0; m<M; m++) {
                if(remove[n][m]) printf("%d ", 0);
                else printf("%d ", board[n][m]);
            }
            printf("
    ");
        }
    }
  • 相关阅读:
    1.1 What is the plug-in?
    Chapter 8 The Simplest Plug-in Solution
    Chapter 7 Resources in Plug-In(1)
    Chapter 1: Plug-in programing from past to the future
    Android插件化的兼容性(下):突破Android P中灰黑名单的限制
    Android插件化的兼容性(中):Android P的适配
    Android插件化的兼容性(上):Android O的适配
    pandas 学习 第12篇:DataFrame 避免链式赋值
    NumPy 学习 第三篇:矢量化和广播
    Wait Type 整理
  • 原文地址:https://www.cnblogs.com/meelo/p/7684435.html
Copyright © 2020-2023  润新知