RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1184084
Accepted
A_Hatake
A_Hatake
Asked:2020-09-30 01:26:37 +0000 UTC2020-09-30 01:26:37 +0000 UTC 2020-09-30 01:26:37 +0000 UTC

B:三个旋转矩形

  • 772

给定三个矩形 A、B 和 C,由它们的边长给出。需要确定是否可以将它们排列在一个平面上,以便满足两个条件:

1. 矩形的所有边相互平行/垂直;2.rectangle A 内部包含矩形 B 和 C(允许侧面触摸); 允许旋转矩形。 第一行包含六个用空格分隔的正整数:𝑎1、𝑎2、𝑏1、𝑏2、𝑐1、𝑐2。矩形 A 的边长是𝑎1 和𝑎2,矩形B 是𝑏1 和𝑏2,矩形C 是𝑐1 和𝑐2。所有数字不超过100。如果可以按照要求的方式排列矩形,则输出单词YES,否则输出NO。程序有问题。请建议可以做/纠正的事情:)我开始学习C

#include<stdio.h>
int main(){
    int a1, a2, b1, b2, c1, c2;
    scanf("%d %d %d %d %d %d", &a1, &a2, &b1, &b2, &c1, &c2);
    if ((b1<a1)&&(b2<a2)){
     if((c1<(a1-b1))&&(c2<(a2-b2))){
         printf("YES");
     } 
     if((c1<(a2-b2))&&(c2<(a1-b1))){
         printf("YES");
     }
     else{
         printf("NO");
     }
    }
    if ((b1<a2)&&(b2<a1)){
        if((c1<(a2-b1))&&(c2<(a1-b2))){
            printf("YES");
        }
        if((c1<(a1-b2))&&(c2<(a2-b1))){
            printf("YES");
        }
        else{
            printf("NO");
        }
    }
    else{
        printf("NO");
    }
}

更正代码时,发生了这样的事情(剧透:当你输入一些数据时,程序仍然没有产生任何东西)

 #include<stdio.h>
int main(){
    int a1, a2, b1, b2, c1, c2;
    scanf("%d %d %d %d %d %d", &a1, &a2, &b1, &b2, &c1, &c2);
    if ((b1<=a1)&&(b2<=a2)){
     if(((c1<=(a1-b1))&&(c2<=(a2-b2))) || ((c1<=(a2-b2))&&(c2<=(a1-b1)))){
         printf("YES");
     } 
    }
    else if ((b1<=a2)&&(b2<=a1)){
        if(((c1<=(a2-b1))&&(c2<=(a1-b2))) || ((c1<=(a1-b2))&&(c2<=(a2-b1)))){
            printf("YES");
        }
    }
    else{
        printf("NO");
    }
}

经过一夜的折磨和痛苦,这个程序成功地通过了所有测试,并给出了正确的答案:

#include <stdio.h>
int inside(int a1, int a2, int b1, int b2)
{
    if(a1>=b1 && a2>=b2)
    {
        return 1;
    }
    return 0;
}

int inside_r(int a1, int a2, int b1, int b2)
{
    return inside(a1, a2, b1, b2) || inside(a1, a2, b2, b1);
}

int inside_2(int a1, int a2, int b1, int b2, int c1, int c2)
{
    int d1, d2;
    d1=a1-b1;
    d2=a2-b2;
    int result=0;
    result=result || inside_r(d1, a2, c1, c2) && inside (a1, a2, b1, b2);
    result=result || inside_r(a1, d2, c1, c2) && inside (a1, a2, b1, b2);
    return result;
}
int inside_2_r(int a1, int a2, int b1, int b2, int c1, int c2)
{
    return inside_2(a1, a2, b2, b1, c1, c2) || inside_2(a1, a2, b1, b2, c1, c2);
}



int main()
{
    int a1, a2, b2, b1, c1, c2;
    scanf ("%d %d %d %d %d %d", &a1, &a2, &b2, &b1, &c1, &c2);
    if (inside_2_r(a1, a2, b2, b1, c1, c2))
    {
         printf("YES");
    }
    else
    {
    printf("NO");
    }
    return 0;
}
c
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. Zhihar
    2020-09-30T03:20:06Z2020-09-30T03:20:06Z

    当你重新编写代码时,这次你忘记打印 NO 以防万一出现不成功的情况

    应该是这样的:

    if ((b1 <= a1) && (b2 <= a2)) 
    {
        const int dx = a1 - b1;
        const int dy = a2 - b2;
    
        if (((c1 <= dx) && (c2 <= dy)) || ((c1 <= dy) && (c2 <= dx))) {
            printf("YES");
        }
        else {
            printf("NO");
        }
    }
    else if ((b1 <= a2) && (b2 <= a1)) 
    {
        const int dx = a2 - b1;
        const int dy = a1 - b2;
    
        if (((c1 <= dx) && (c2 <= dy)) || ((c1 <= dy) && (c2 <= dx))) {
            printf("YES");
        }
        else {
            printf("NO");
        }
    }
    else {
        printf("NO");
    }
    

    但总的来说,算法是不正确的:),应该是这样的:

    1. 如果 B 水平放置在 A 中,检查剩余多少可用空间

    2. 如果 A 垂直放置在 A 中,检查剩余多少可用空间

    3. 从 1) 和 2) 获得的尺寸(为方便起见) min x min

    4. 检查指定尺寸 C 是垂直还是水平

    那些。代码应该是这样的:

    // положить прямоугольник A горизонтально (т.е. горизонтальная сторона больше вертикальной)
    const int d1 = (a1 > a2) ? a1 : a2;
    const int d2 = (a1 < a2) ? a1 : a2;
    
    // подсчитать размер свободного места если разместить прямоугольник B в горизонтальном виде
    const int dx1 = d1 - b1;
    const int dy1 = d2;
    
    const int dx2 = d1;
    const int dy2 = d2 - b2;
    
    // подсчитать размер свободного места если разместить прямоугольник B в вертикальном виде
    const int dx3 = d1 - b2;
    const int dy3 = d2;
    
    const int dx4 = d1;
    const int dy4 = d2 - b1;
    
    // положить прямоугольник С горизонтально (т.е. горизонтальная сторона больше вертикальной)
    const int e1 = (c1 > c2) ? c1 : c2;
    const int e2 = (c1 < c2) ? c1 : c2;
    
    // определить можно ли разместить прямоугольник C в свободном месте
    const bool isSuccess1 = (e1 <= dx1) && (e2 <= dy1) || (e2 <= dx1) && (e1 <= dy1);
    const bool isSuccess2 = (e1 <= dx2) && (e2 <= dy2) || (e2 <= dx2) && (e1 <= dy2);
    
    const bool isSuccess3 = (e1 <= dx3) && (e2 <= dy3) || (e2 <= dx3) && (e1 <= dy3);
    const bool isSuccess4 = (e1 <= dx4) && (e2 <= dy4) || (e2 <= dx4) && (e1 <= dy4);
    
    // если хотя бы в каком-то положении разместить можно - вывести информацию об успехе
    printf((isSuccess1 || isSuccess2 || isSuccess3 || isSuccess4) ? "YES" : "NO");
    

    B 在 A 中的每个位置都有 2 个空闲位置(最多):

    在此处输入图像描述

    可能我写的太多了:)

    • 2
  2. Zhihar
    2020-09-30T01:41:09Z2020-09-30T01:41:09Z

    在您的情况下,它说:

    允许侧面接触

    为什么要使用严格的不等式<,>什么时候应该不严格<=,>=

    好吧,第二个也是更重要的错误:

    得到一些结果后 - 停止工作(返回做),否则得到以下结果:

     // допустим выполняется это условие
     if((c1<(a1-b1))&&(c2<(a2-b2))){
         printf("YES");
     }
    
     // напечатали YES
    
     // но поскольку мы не вышли, то проверяется теперь и это условие
     if((c1<(a2-b2))&&(c2<(a1-b1))){
         printf("YES");
     }
     else{
         printf("NO");
     }
    
     // и поскольку оно не выполняется - печатает NO (ну или если выполняется - YES)
     // в результате вместо ожидаемого одного ответа - будет два, причем второй может быть и неверным
    

    代码应改写为形式

     if((c1<(a1-b1))&&(c2<(a2-b2))){
         printf("YES");
     }
     else if((c1<(a2-b2))&&(c2<(a1-b1))){
         printf("YES");
     }
     else{
         printf("NO");
     }
    
    • 1
  3. Best Answer
    A_Hatake
    2020-10-01T01:09:55Z2020-10-01T01:09:55Z

    最后,正确的程序变成了这样:

    #include <stdio.h>
    int inside(int a1, int a2, int b1, int b2)
    {
        if(a1>=b1 && a2>=b2)
        {
            return 1;
        }
        return 0;
    }
    
    int inside_r(int a1, int a2, int b1, int b2)
    {
        return inside(a1, a2, b1, b2) || inside(a1, a2, b2, b1);
    }
    
    int inside_2(int a1, int a2, int b1, int b2, int c1, int c2)
    {
        int d1, d2;
        d1=a1-b1;
        d2=a2-b2;
        int result=0;
        result=result || inside_r(d1, a2, c1, c2) && inside (a1, a2, b1, b2);
        result=result || inside_r(a1, d2, c1, c2) && inside (a1, a2, b1, b2);
        return result;
    }
    int inside_2_r(int a1, int a2, int b1, int b2, int c1, int c2)
    {
        return inside_2(a1, a2, b2, b1, c1, c2) || inside_2(a1, a2, b1, b2, c1, c2);
    }
    
    
    
    int main()
    {
        int a1, a2, b2, b1, c1, c2;
        scanf ("%d %d %d %d %d %d", &a1, &a2, &b2, &b1, &c1, &c2);
        if (inside_2_r(a1, a2, b2, b1, c1, c2))
        {
             printf("YES");
        }
        else
        {
        printf("NO");
        }
        return 0;
    }
    
    • 1

相关问题

  • free 出于某种原因不会从内存中删除数组

  • 请帮助代码

  • 为什么 masm 对字符串或文本文字太长发誓,为什么在结构中设置 db 或 dw?

  • 如何将数字拆分为位并将其写入 C 中的数组?

  • 如何以给定的角度移动物体?

  • 解决“子集和问题”的时效算法

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5