Си: три поворачивающихся прямоугольника
Дано три прямоугольника 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 шт):
у вас же в условии написано:
касания сторонами разрешены
почему же вы используете строгие неравенства <, >, когда должно быть нестрогие <=, >=
ну и вторая и еще более важная ошибка:
после того как вы получаете какой-то результат - прекращайте работать (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");
}
а когда вы переделали код, то на этот раз вообще забыли при неудачной ситуации выводить 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");
}
а общем алгоритм неверен :) и должен быть таким:
проверить сколько свободного места останется, если в A разместить B по горизонтали
проверить сколько свободного места останется, если в A разместить B по вертикали
полученные от 1) и 2) размеры представить (для удобства) min x min
проверить входит ли в установленные размеры С вертикально или горизонтально
т.е. код должен быть таким:
// положить прямоугольник 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 свободных места (максимум):
Возможно чего-то лишнего написал :)
в итоге верная программа получилась вот такая:
#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;
}
