zoukankan      html  css  js  c++  java
  • 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("
    ");
        }
    }
  • 相关阅读:
    从一个线上服务器警告谈谈backlog
    聊聊服务器的负载
    Apache 配置说明
    Apache 服务器性能评估
    php之apc浅探
    Linux 服务器 监控命令
    小白学习mysql 之 innodb locks
    小白学习mysql之存储过程的优劣分析以及接入控制
    小白学习mysql之索引初步
    小白学习mysql之优化基础(EXPLAIN的连接类型)
  • 原文地址:https://www.cnblogs.com/meelo/p/7684435.html
Copyright © 2011-2022 走看看