试题编号: 201512-2
试题名称: 消除类游戏
时间限制: 1.0s
内存限制: 256.0MB
问题描述:
问题描述
消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这些棋子都被消除。当有多处可以被消除时,这些地方的棋子将同时被消除。
  现在给你一个n行m列的棋盘,棋盘中的每一个方格上有一个棋子,请给出经过一次消除后的棋盘。
  请注意:一个棋子可能在某一行和某一列同时被消除。
输入格式
输入的第一行包含两个整数n, m,用空格分隔,分别表示棋盘的行数和列数。
  接下来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 ≤ n, m ≤ 30。

问题链接:CCF201512试题。

问题描述

首先输入正整数m和n,分别为矩阵的行和列数,m,n≤30,然后输入m行n列的正整数数据。将m×n矩阵中行或列连续三个元素同值的变为0。

问题分析

有各种各样的实现方法。

方法一:

采用一种不使用额外存储的做法,需要消除的元素暂时将其值变为负值,等行和列都标记之后,再统一消除(置值)为0,最后输出结果。

这种做法编程技巧要高一些,比较锻炼程序员运用技巧的能力。这种能力许多时候显得十分有用。

方法二:

使用额外的二维数组,用于存储需要消除的元素。

这个做法程序逻辑会更加简洁易懂。付出存储的代价也是有回报的。

程序说明

方法一:

1.程序中使用了求整数绝对值的数学函数abs(),网上查了一下说使用库math.h有可能有二义性,应该用stdlib.h来替代,有点吓唬人。也许一些简单的函数自己编写更好。

2.玩程序就是玩时间与空间。这个程序使用了一点技巧,标记删除元素时,暂时置为负值。这样做节省了存储空间,但是需要付出一定的时间代价。程序员需要掌握时间与空间的平衡,采用合理的措施。

3.这个程序逻辑上是简洁的,易于阅读。

4.使用函数memset()对数组进行初始化是套路。

方法二:

就不需要说明什么了,都是简单套路。

题记

时间与空间是可以交换的,空间与逻辑也是可以交换的。

付出空间的代价,可以换来程序逻辑的简洁。

提交后得100分的C语言程序(方法二)如下:

/* CCF201512-2 消除游戏 */#include <stdio.h>
#include <string.h>#define N 30int a[N][N], t[N][N];int main(void)
{int n, m, i, j;scanf("%d%d", &n, &m);for(i=0; i<n; i++)for(j=0; j<m; j++)scanf("%d", &a[i][j]);memset(t, 0, sizeof(t));// 进行行标记(可以消除则置1)for(i=0; i<n; i++)for(j=0; j<m-2; j++)if(a[i][j]== a[i][j + 1] && a[i][j + 1] == a[i][j +2])t[i][j] = t[i][j + 1] = t[i][j + 2] = 1;// 进行列标记(可以消除则置1)for(j=0; j<m; j++)for(i=0; i<n-2; i++)if(a[i][j] == a[i + 1][j] && a[i + 1][j] == a[i + 2][j])t[i][j] = t[i + 1][j] = t[i + 2][j] = 1;// 重置矩阵afor(i=0; i<n; i++)for(j=0; j<m; j++)if(t[i][j])a[i][j] = 0;// 输出结果for(i=0; i<n; i++) {for(j=0; j<m; j++) {if(j != 0)printf(" ");printf("%d", a[i][j]);}printf("\n");}return 0;
}

提交后得100分的C++语言程序(方法一)如下:

/* CCF201512-2 消除游戏 */#include <iostream>
#include <cmath>using namespace std;const int N = 30;int grid[N][N], n, m;int main()
{// 输入数据cin >> n >> m;for(int i=0; i<n; i++)for(int j=0; j<m; j++) {cin >> grid[i][j];}// 进行行标记(可以消除则置为负)for(int i=0; i<n; i++)for(int j=0; j<m-2; j++) {if(abs(grid[i][j]) == abs(grid[i][j+1]) && abs(grid[i][j+1]) == abs(grid[i][j+2])) {if(grid[i][j] > 0)grid[i][j] = - grid[i][j];if(grid[i][j+1] > 0)grid[i][j+1] = - grid[i][j+1];if(grid[i][j+2] > 0)grid[i][j+2] = - grid[i][j+2];}}// 进行列标记(可以消除则置为负)for(int j=0; j<m; j++)for(int i=0; i<n-2; i++) {if(abs(grid[i][j]) == abs(grid[i+1][j]) && abs(grid[i+1][j]) == abs(grid[i+2][j])) {if(grid[i][j] > 0)grid[i][j] = - grid[i][j];if(grid[i+1][j] > 0)grid[i+1][j] = - grid[i+1][j];if(grid[i+2][j] > 0)grid[i+2][j] = - grid[i+2][j];}}// 进行清除(可以消除则置为0)并且输出结果for(int i=0; i<n; i++) {for(int j=0; j<m; j++) {if(grid[i][j] < 0)grid[i][j] = 0;if(j != 0)cout << " ";cout << grid[i][j];}cout << endl;}return 0;
}

计算绝对值的数学函数abs()有可能有二义性,自己编写了计算绝对值的函数;二维数组采用动态化声明(C99等是支持的)。

改进后100分的C++程序(方法一)如下:

/* CCF201512-2 消除游戏 */#include <iostream>using namespace std;inline int myabs(int x)
{return (x >= 0) ? x : -x;
}int main()
{// 输入数据int n, m;cin >> n >> m;int grid[n][m];for(int i=0; i<n; i++)for(int j=0; j<m; j++) {cin >> grid[i][j];}// 进行行标记(可以消除则置为负)for(int i=0; i<n; i++)for(int j=0; j<m-2; j++) {if(myabs(grid[i][j]) == myabs(grid[i][j+1]) && myabs(grid[i][j+1]) == myabs(grid[i][j+2])) {if(grid[i][j] > 0)grid[i][j] = - grid[i][j];if(grid[i][j+1] > 0)grid[i][j+1] = - grid[i][j+1];if(grid[i][j+2] > 0)grid[i][j+2] = - grid[i][j+2];}}// 进行列标记(可以消除则置为负)for(int j=0; j<m; j++)for(int i=0; i<n-2; i++) {if(myabs(grid[i][j]) == myabs(grid[i+1][j]) && myabs(grid[i+1][j]) == myabs(grid[i+2][j])) {if(grid[i][j] > 0)grid[i][j] = - grid[i][j];if(grid[i+1][j] > 0)grid[i+1][j] = - grid[i+1][j];if(grid[i+2][j] > 0)grid[i+2][j] = - grid[i+2][j];}}// 进行清除(可以消除则置为0)并且输出结果for(int i=0; i<n; i++) {for(int j=0; j<m; j++) {if(grid[i][j] < 0)grid[i][j] = 0;if(j != 0)cout << " ";cout << grid[i][j];}cout << endl;}return 0;
}

CCF201512-2 消除类游戏(100分)相关推荐

  1. CCF CSP 201512-2 消除类游戏(C++语言100分)

    1. 问题链接:CCF 201512-2 消除类游戏 试题编号: 201512-2 试题名称: 消除类游戏 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 消除类游戏是深受大众 ...

  2. 消除类游戏(js版)

    原文:消除类游戏(js版) 最近一直在玩一款消灭星星的消除类游戏,周末无聊就用js也写了一遍,感觉玩比写还困难一直玩不到10000分.废话不多说直接上源码. 效果图(ps 页面有点难看木有美工) 代码 ...

  3. (JAVA) 消除类游戏-201512-2

    问题描述 试题编号: 201512-2 试题名称: 消除类游戏 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进 ...

  4. 用cocos2d-html5做的消除类游戏《英雄爱消除》(1)——系统主菜单

    系统主菜单如下图所示: 首先,介绍下这个主菜单,它包含了一个动画logo以及一个按钮选项,动画logo每隔1秒钟切换一张图片,点击相应的按钮选项会切换不同的游戏场景. 下面看下这个界面的源码: /** ...

  5. CCF2015-12-2 消除类游戏

    试题编号: 2015-12-2 试题名称: 消除类游戏 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上 ...

  6. csp试题2:消除类游戏

    csp试题2:消除类游戏 题目 分析 代码 总结 题目 问题描述       消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋 ...

  7. C语言-数组-消除类游戏

    做题时借鉴了'Pss9526'的思路,个人认为比我自己原先写的更加易于理解,于此传送 题目:消除类游戏 问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每 ...

  8. XDOJ 消除类游戏

    题目描述: 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这些棋子都被 ...

  9. ccf题库中2015年12月2号消除类游戏

    题目如下: 问题描述消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这些 ...

最新文章

  1. COM如何区分套间线程(apartment thread)和自由线程(free thread)
  2. Console-算法[for,if]-(大马-小马-马驹托砖)
  3. Logstash 使用http output处理数据
  4. java向指定文件继续写内容_java 向指定文件写入内容(如文件存在,则先删除再创建;写入如目录不存在,则创建)...
  5. art.dialog弹出框后再根据其内部iframe的大小调整大小
  6. mysql授权远程访问
  7. 有人说男人赚钱都是为了女人,这话说的有道理吗?
  8. (转)Rust :文件分层
  9. 在Win32中管理虚拟内存——举例
  10. ZYNQ PL开发流程
  11. 天翼云,不要来,千万不要来!开始统计工时,安装监控软件,减少福利!
  12. 电脑怎么连接隐藏的无线WiFi ?
  13. 详解Unity中的粒子系统Particle System (十)
  14. 【转】表情识别(一)--传统方法概述
  15. git fatal: detected dubious ownership in repository
  16. 数据库中的数据完整性约束
  17. word文档太大怎么压缩到最小
  18. 矢量控制与V/F控制详解
  19. AdaptiveAvgPool1D内部实现
  20. Linux系列——常用命令与shell函数总结

热门文章

  1. [电子书地址]小学、初中、高中电子课本大全(为孩子收藏吧)
  2. Java Swing 实现loading进度条加载效果
  3. Execution Error,return code 2 from org.apache.haddop.hive.ql.exec.mr.MapRedTask解决办法
  4. 美女面试官问我:能说几个常见的Linux性能调优命令吗?
  5. 神经网络和深度学习(5)-- 逻辑回归
  6. openstack 逻辑构架真相
  7. 第十一章、后置处理Bean
  8. LINK : warning LNK4075: 忽略“/INCREMENTAL”(由于“/PROFILE”规范)
  9. 计算机网络中集成性和交互性,【计算机类职业资格】一级B笔试-366及答案解析.doc...
  10. 计算机二级考试全攻略