CSP 201512-2 消除类游戏【C语言】

本来博主很懒,觉得自己的题会做就可以,不想写CSDN了,有点浪费时间;可是我的小傻瓜不听话,不想写CSP,准备和我一起考下次的CSP,所以我还是坚持写一下,万一他看到了我写的CSDN。还可以知道,他该学习了!!!
当然啦,看到这篇文章的都是小傻瓜(虽然不是我的),但要努力学习偶
这道题作为第二道题算是比较复杂一点的了,要比往次的CSP认证的第二题难一些(除了Z字形扫描那一次),但还是有办法解决的


一、题目预览

1.问题描述

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

2.输入格式

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

3.输出格式

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

4.样例输入/样例输出

样例输入
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

5.样例说明

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

6.评测用例规模与约定

所有的评测用例满足:1 ≤ n, m ≤ 30。

二、解题思路

1.如何确定哪些方块应该被消除:

当三个方块数字相同时,我们就标记这三个数字。用按行循环和按列循环的方式,完成横向消除和纵向消除的方块

2.如何标记方块:

当方块的数字有三个紧挨着的相同时,可以存入其相反数,当比较时比较其绝对值(fabs,在math.h中)这样标记方法比较好用,可以区别是否标记过,也不影响原来的数字值

3.如何消除方块:

将方块中数字小于0的方块赋值为0

4.最后一步:打印

按照二重数组,循环打印矩阵


三、程序代码

#include<stdio.h>
#include<math.h>
int a[30][30]={0};
int main(){
    int m,n;
    scanf("%d %d",&m,&n);
    int i,j;
    for(i=0;i<m;i++){
        for(j=0;j<n;j++){
            scanf("%d",&a[i][j]);
        }
    }
    for(j=0;j<m;j++){
    for(i=1;i<n-1;i++){
        if(fabs(a[j][i-1])==fabs(a[j][i])&&fabs(a[j][i])==fabs(a[j][i+1])){
            if(a[j][i+1]>0)
            a[j][i+1]=-a[j][i+1];
            if(a[j][i-1]>0)
            a[j][i-1]=-a[j][i-1];
            if(a[j][i]>0)
            a[j][i]=-a[j][i];
        }
    }
    }
    for(j=0;j<n;j++){
    for(i=1;i<m-1;i++){
     if(fabs(a[i][j])==fabs(a[i-1][j])&&fabs(a[i][j])==fabs(a[i+1][j])){
        if(a[i][j]>0)
        a[i][j]=-a[i][j];
        if(a[i-1][j]>0)
        a[i-1][j]=-a[i-1][j];
        if(a[i+1][j]>0)
        a[i+1][j]=-a[i+1][j];
     }
    }
    }

    for(i=0;i<m;i++){
        for(j=0;j<n;j++){
            if(a[i][j]<0)
            a[i][j]=0;
        }
    }
    for(i=0;i<m;i++){
        for(j=0;j<n;j++){
            printf("%d ",a[i][j]);
        }
        printf("\n");
    }
    return 0;
}

四、运行结果

在这里插入图片描述

总结

在写这道题时,我写了很多二重循环,起初我还担心是不是会运行超时啥的,看结果我的担心是多余的。。。。hahahahaha

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用\[1\]和引用\[2\]中的C++代码,这是一个解决csp201409-2问题的代码。该问题的具体描述没有提供,但是根据代码的内容可以推测,这个问题涉及到计算矩形的重叠面积。 引用\[1\]中的代码使用了一个二维向量来存储矩形的坐标信息,并通过遍历计算重叠的面积。引用\[2\]中的代码使用了一个二维数组来表示矩形,并通过遍历数组来计算重叠的面积。 引用\[3\]中的描述提到了解决这个问题的思路。他们尝试了不同的方法,但都面临着面积重叠的问题。 综上所述,这段代码是用来解决csp201409-2问题的,具体问题描述没有提供,但是代码中的逻辑可以用来计算矩形的重叠面积。 #### 引用[.reference_title] - *1* *3* [【csp201409-2】画图](https://blog.csdn.net/weixin_51305111/article/details/128713458)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [csp 201409-2 画图(含解析思路)](https://blog.csdn.net/weixin_44915226/article/details/108582368)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值