Задача
Пройдет ли кирпич со сторонами [latex]a[/latex], [latex]b[/latex] и [latex]c[/latex] сквозь прямоугольное отверстие со сторонами [latex]r[/latex] и [latex]s[/latex]? Стороны отверстия должны быть параллельны граням кирпича.
A | B | C | R | S | Ответ |
10 | 8 | 7 | 4 | 3 | Impossible |
1 | 9 | 8 | 5 | 9 | Possible |
5 | 5 | 5 | 8 | 2 | Impossible |
4.5 | 4 | 4 | 5 | 5 | Possible |
0.5 | 3.4 | 0.8 | 4 | 2.5 | Possible |
Код программы на C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <iostream> using namespace std; int main() { double a, b, c, r, s; bool x = false; // Переменная, с помощью которой мы увидим невозможность выполнения задачи cout << "Write size of brick: \n"; cin >> a >> b >> c; cout << "Write size of slot: \n"; cin >> r >> s; if ((((a < r) && (b < s)) || ((b < r) && (a < s)))|| //Проверка трех вариантов расположения кирпича (((b < r) && (c < s)) || (( c < r) && (b < s)))|| (((a < r) && (c < s)) || ((c < r) && (a < s)))) x=true; printf( x? "Possible" : "Impossible"); return 0; } |
Код программы на Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
class Main { public static void main (String[] args) throws java.lang.Exception { Scanner in = new Scanner(System.in); double a,b,c,r,s; boolean x=false; System.out.println("Write size of brick:"); a=in.nextDouble(); b=in.nextDouble(); c=in.nextDouble(); System.out.println("Write size of slot: "); r=in.nextDouble(); s=in.nextDouble(); if ((((a < r) && (b < s)) || ((b < r) && (a < s))) || (((b < r) && (c < s)) || (( c < r) && (b < s)))|| (((a < r) && (c < s)) || ((c < r) && (a < s)))) x=true; if(x) System.out.println("Possible"); else System.out.println("Impossible "); } } |
В этой задаче я считаю, что если длины соответствующих сторон равны — то кирпич проходит не будет. Также считаем что ни одна из сторон не может быть нулем. Поскольку нам надо проверить входит ли кирпич в щель в общем, мы имеем право рассматривать три варианта положения кирпича относительно щели. Во всех трех случаях алгоритм одинаков. Он состоит в сравнении сторон щели и сторон грани. По крайней мере две стороны кирпича должны быть меньше двух сторон щели. Если два условия выполняются — то переменной [latex]x[/latex] присваивают значение true и выводится на экран сообщение, что выполнить задачу возможно. В противном случае значение переменной останется неизменным. Как следствие будет выведено на экран сообщение, что эта задача не разрешима.
— Что означает «параметры кирпича или щели сходятся»? Совпадают? Напишите чётче, что должно совпадать.
— Что означает «рассматривать кирпич с трех разных пар граней»? Грань кирпича, это прямоугольник. Какие три пары прямоугольников Вы имеете в виду? Подберите правильные слова, пожалуйста. Или удалите этот абзац.
— Нумерация сторон кирпича не задана. Просто пишите возможно или нет. Без указания 1, 2 или 3.
— Довольно сложно находите решение. По Вашему, совершенно справедливому замечанию, нужно выбрать такие 2 измерения кирпича (всего 3 варианта) чтобы в некотором порядке они были меньше сторон отверстия. Т.е. всего шесть пар сравнений в одном условии. Т.е. при правильной формулировке условий 3 внешних условных оператора с суммами длинами сторон оказываются излишними.
Ваша программа работает правильно, поскольку из выполнения Ваших 15 условий следует то, что я написал. Но если, в 23-й строке условие записать так
((a < r) && (b < s)) || ((b < r) && (a < s)), то 22-я строка не понадобится. Ну и условия из 31-й и 39-й можно дописать сюда же через логическое "или". Могу зачесть работу в таком виде как сейчас, но снизив балл. Или исправьте и напишите, когда будет готово к проверке.
Теперь точно нет. Вы пишите «Каждая сторона кирпича должна быть меньше хотя бы одной стороны щели». Это неверно. Та сторона вдоль которой кирпич двигается может быть любой длины. Исправьте это в описании.
— Строки 18, 19, 22 нужно сдвинуть вправо относительно соседей. Строки 15,16 тоже лучше сдвигом подогнать под соответствующий текст из 14-й.
— «Оно состоит» — кто оно?
— «В противном случае значение переменной не будет присвоено». Это не так. Значение уже присвоено в 9-й строке. Я догадываюсь, что Вы хотите сказать. Но лучше написать всё вразумительно.
Принято
Извините, но у Вас в Java нарушены отступы — поправьте их!
в Java нарушены отступы, кроме того лучше:
boolean x= (((a < r) && (b < s)) || ((b < r) && (a < s))) || (((b < r) && (c < s)) || (( c < r) && (b < s))) || (((a < r) && (c < s)) || ((c < r) && (a < s)))