怪痴梦 2024-09-15 13:33 采纳率: 100%
浏览 2
已结题

CSP2015-12-02求指导

CSP2015-12-02使用C++,模拟测试只能得60分,整体逻辑感觉没啥问题,求指导指导

img

我的代码:

#include<bits/stdc++.h>
using namespace std;
int a[31][31];
//定义一个结构体,存放进行判断的行列以及向下和向右相除的个数
struct list_num
{
    int row=0, col=0;
    int num1=0, num2=0;
};
int main() {
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> a[i][j];
        }
    }
    int num = 0;
    list_num b[1001];
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            b[num].row = i;
            b[num].col = j;
            //行判断
            for (int k = j+1; k < m; k++) {
                if (a[i][j] == a[i][k]) {
                    b[num].num1++;
                }
                else {
                    break;
                }
            }
            //列判断
            for (int l = i+1; l < n; l++) {
                if (a[i][j] == a[l][j]) {
                    b[num].num2++;
                }
                else
                {
                    break;
                }
            }
            num++;
        }
    }
    //进行消除处理
    for (int n1 = 0; n1 < num; n1++) {
        int i = b[n1].row, j = b[n1].col;
        //只要相同的数大于3个就会进行消除为0
        if (b[n1].num1 >= 2) {
            for (int n2=0; n2 <= b[n1].num1; n2++) {
                a[i][j+n2] = 0;
            }
        }
        else if (b[n1].num2 >= 2) {
            for (int n3 = 0; n3 <= b[n1].num2; n3++) {
                a[i+n3][j] = 0;
            }
        }
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cout << a[i][j] << " ";
        }
        cout << endl;
    }
    return 0;
}

  • 写回答

1条回答 默认 最新

  • 一轮明月照丘壑 2024-09-15 13:34
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    根据您提供的代码和问题描述,我发现了几个可能导致您只能得到部分分数的问题。让我们一步步来解决它们。

    1. 数组定义和结构体数组定义大小: 您定义的数组a[31][31]和结构体数组b的大小可能不够大,如果输入的数据超出了这些大小,程序可能会出错。建议使用动态分配来确保足够的大小,或者根据输入的大小动态调整数组大小。
    2. 消除逻辑: 您的消除逻辑中,如果某一行或某一列上有连续的三个或以上相同颜色的棋子时,您将消除这些棋子。但在处理时,您的代码没有正确处理超过三个棋子的连续序列。这意味着当有四个或更多连续的棋子时,可能只会消除三个,而不是全部。因此,需要修正循环中的条件以确保正确消除所有连续棋子。
    3. 处理重叠的消除: 当某个棋子同时在行和列上满足消除条件时,您的代码可能会只处理其中一个方向的消除,而忽略另一个方向的消除。需要更详细的逻辑来处理这种情况。具体来说,如果一个位置满足行和列的消除条件,需要分别处理行和列的消除操作。同时也要注意确保一个棋子在多个方向上同时被消除时不会被多次清除。一种方法是设置一个标志数组来跟踪已经消除的棋子位置。这样,如果一个位置已经被清除(例如通过行清除),则在列清除时就不会再次清除它。

    针对上述问题,我会提供一个简化的思路来帮助您改进代码:

    • 首先遍历整个棋盘记录连续棋子的数量。
    • 然后根据记录的结果进行消除操作。在这一步中,要特别注意同时满足行和列消除条件的棋子的处理逻辑。可以使用一个额外的数组来跟踪已经被清除的位置。例如设置一个二维数组 isRemoved[n][m] 来标记哪些位置已经被清除。这样可以避免一个棋子在多个方向上被多次清除的问题。如果某一位置的棋子已经被标记为清除(例如在行上),则在处理列时跳过它。
    • 最后输出经过消除后的棋盘。

    这是一个大致的思路,具体的实现可能需要一些细节上的调整和优化。希望这能帮助您改进代码并解决问题!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 9月23日
  • 已采纳回答 9月15日
  • 创建了问题 9月15日