额,不知道写啥。 2024-06-11 18:37 采纳率: 71.4%
浏览 74

【2024年中山市信息学邀请赛小学组线上赛】宝石迷阵c++

__

#include<bits/stdc++.h>
using namespace std;
int x,y;
struct node{
    int x;
    int y;
}a[10001];
bool cmp(node x,node y){
    return x.x<y.x;
}
bool cmp1(node x,node y){
    return x.y<y.y;
}

int h,w,c;
int vis[100000001],vis1[100000001];
int main(){
    cin>>h>>w>>c;
    for(int i=1;i<=c;i++){
        cin>>a[i].x>>a[i].y;
        vis[a[i].x]=1;
        vis[a[x].y]=1;
    }
    for(int i=1;i<=h;i++){
        if(vis[i]!=1){
            sort(a+1,a+1+c,cmp);
            int l=0,r=c;
            while(l>r){
                int m=(l+r)/2;
                if(a[m].x<i){
                    l=m;
                }
                else{
                    r=m;
                }
            }
            for(int j=l+2;j<=c;j++){
                vis[a[j].x]=0,vis[a[j].x-1]=1;
                a[j].x--;
            }
        }
    }
    for(int i=1;i<=w;i++){
        if(vis1[i]!=1){
            sort(a+1,a+1+c,cmp1);
            int l=0,r=c;
            while(l>r){
                int m=(l+r)/2;
                if(a[m].x<=i){
                    l=m;
                }
                else{
                    r=m;
                }
            }
            for(int j=l+2;j<=c;j++){
                vis[a[j].y]=0,vis[a[j].y-1]=1;
                a[j].y--;
            }
        }
    }
    for(int i=1;i<=c;i++){
        cout<<a[i].x<<" "<<a[i].y<<endl;
    }
}

```

  • 写回答

5条回答 默认 最新

  • 阿里嘎多学长 2024-06-11 18:37
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    这段代码是针对“宝石迷阵”问题的一个C++实现,下面我将逐一检查并提出可能的问题和改进建议:

    1. vis数组和vis1数组的初始化和使用

      • visvis1数组用于标记行和列是否已经被访问过。数组的初始化是正确的,使用了memset函数将所有元素初始化为0。
      • 但是,数组的大小应该是h+1w+1,因为下标是从1开始的,这样可以确保数组的索引不会越界。
    2. 排序函数cmpcmp1

      • 排序函数cmpcmp1看起来是正确的,它们分别根据xy坐标进行排序。
    3. 二分查找逻辑

      • 二分查找的逻辑在两个for循环中被使用,但是存在一些问题:
        • while循环的条件应该是l < r而不是l > r
        • 在二分查找中,应该使用a[m].y < i而不是a[m].x < i来确定是否需要向左或向右搜索。
        • 在更新宝石位置的循环中,vis[a[j].x-1] = 1;应该是vis1[a[j].x-1] = 1;,因为vis1数组是用于标记列的。
    4. 宝石位置的更新

      • 在更新宝石位置的逻辑中,应该在找到合适的位置后,将宝石的位置减1,然后标记新的列或行。但是,当前代码中并没有正确地更新宝石的位置。
    5. 输出格式

      • 输出格式需要根据题目的具体要求来确定。当前代码中的输出似乎是正确的,但是需要确保所有宝石的位置都被正确打印出来。
    6. 其他潜在问题

      • cin>>a[i].x>>a[i].y; 这一行中,a[x]应该是a[i]
      • sort函数的调用可能需要调整,因为sort函数的参数应该是数组的起始和结束位置,而不是数组元素的引用。
    7. 代码优化

      • 可以使用更有效的数据结构,比如线段树或者树状数组,来处理宝石的位置更新,这样可以减少时间复杂度。
    8. 参考资料

      • 由于这是一个特定的问题,可能没有直接的参考资料。但是,可以查找关于二分查找、排序算法和数据结构优化的一般性资料。

    请注意,这些只是基于代码片段的初步分析和建议。实际的代码实现可能需要根据题目的具体要求和测试用例进行调整。如果需要更详细的代码实现或进一步的帮助,可以提供更多的信息或具体的问题描述。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月11日