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

【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日

悬赏问题

  • ¥15 数据量少可以用MK趋势分析吗
  • ¥15 使用VH6501干扰RTR位,CANoe上显示的错误帧不足32个就进入bus off快慢恢复,为什么?
  • ¥15 大智慧怎么编写一个选股程序
  • ¥100 python 调用 cgps 命令获取 实时位置信息
  • ¥15 两台交换机分别是trunk接口和access接口为何无法通信,通信过程是如何?
  • ¥15 C语言使用vscode编码错误
  • ¥15 用KSV5转成本时,如何不生成那笔中间凭证
  • ¥20 ensp怎么配置让PC1和PC2通讯上
  • ¥50 有没有适合匹配类似图中的运动规律的图像处理算法
  • ¥15 dnat基础问题,本机发出,别人返回的包,不能命中