((http://server.179.ru/olymp/2008/statements/b.html Условия задачи второго тура))
%%(email) // В данных переменных будем хранить исходные данные // Первый прямоугольник: (x1,y1):(x2,y2) // Второй прямоугольник: (x3,y3):(x4,y4) int x1,y1,x2,y2,x3,y3,x4,y4; cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3 >> x4 >> y4;
// Для каждого прямоугольника сделаем "каноническое" представление // Первый прямоугольник: (X1,Y1):(X2,Y2), причем // (X1,Y1) - его левый нижний угол, а (X2:Y2) - правый верхний угол. int X1, Y1, X2, Y2, X3, Y3, X4, Y4;
// Тогда x-координата левого нижнего угла это min из x-координат двух его углов, X1=min(x1,x2); // x-координата правого верхнего угла - это max из x-координат двух его углов X2=max(x1,x2); // Аналогично находим Y1 и Y2 Y1=min(y1,y2); Y2=max(y1,y2);
// Аналогично зададим канонические координаты для второго прямоугольника X3=min(x3,x4); X4=max(x3,x4); Y3=min(y3,y4); Y4=max(y3,y4);
// Введем переменные для хранения координат пересечения двух прямоугольников // left - левая граница пересечения, это max из левых границ исходных прямоугольников int left=max(X1,X3); // right - правая граница пересечения, это min из правых границ исходных прямоугольников int right=min(X2,X4); // bottom - нижняя граница пересечения int bottom=max(Y1,Y3); // top - верхняя граница пересечения int top=min(Y2,Y4);
// Пересечение непусто, если правая его граница больше левой, // а верхняя граница больше нижней. // В этом случае площадь пересечения равна (right-left)*(top-bottom) // В противном случае она равна 0 if(right>left && top>bottom) cout<<(right-left)*(top-bottom)<<endl; else cout<<0<<endl; %%
---- адрес оригинала: ((/Информатика/Олимпиады/2008/Школьная/Разбор/B))