Си: три поворачивающихся прямоугольника

Дано три прямоугольника A, B и C, заданных длинами своих сторон. Нужно определить, можно ли расположить их на плоскости так, чтобы выполнялось два условия:

1.все стороны прямоугольников параллельны/перпендикулярны друг другу; 2.прямоугольник A содержит внутри себя прямоугольники B и C (касания сторонами разрешены); Поворачивать прямоугольники разрешается. В первой строке содержится шесть целых положительных чисел, записанных через пробел: ?1, ?2, ?1, ?2, ?1, ?2. Длины сторон прямоугольника A равны ?1 и ?2, прямоугольника B — ?1 и ?2, а прямоугольника C — ?1 и ?2. Все числа не превышают 100. Нужно вывести слово YES, если расположить прямоугольники требуемым образом можно, и 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))){
         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;
}

Ответы (3 шт):

Автор решения: Zhihar

у вас же в условии написано:

касания сторонами разрешены

почему же вы используете строгие неравенства <, >, когда должно быть нестрогие <=, >=

ну и вторая и еще более важная ошибка:

после того как вы получаете какой-то результат - прекращайте работать (return делайте), иначе получается следующее:

 // допустим выполняется это условие
 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");
 }
→ Ссылка
Автор решения: Zhihar

а когда вы переделали код, то на этот раз вообще забыли при неудачной ситуации выводить 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. проверить сколько свободного места останется, если в A разместить B по горизонтали

  2. проверить сколько свободного места останется, если в A разместить B по вертикали

  3. полученные от 1) и 2) размеры представить (для удобства) min x min

  4. проверить входит ли в установленные размеры С вертикально или горизонтально

т.е. код должен быть таким:

// положить прямоугольник 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 свободных места (максимум):

введите сюда описание изображения

Возможно чего-то лишнего написал :)

→ Ссылка
Автор решения: A_Hatake

в итоге верная программа получилась вот такая:

#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;
}
→ Ссылка