Програма фрезерування складається з кроків. Нехай на -му (1 \le i \le s) кроці від поверхні в стовпці j~(1 \le j \le x) зрізається шар товщиною m_{ij}. Тоді очевидно, що сумарно в стовпці буде знято
Схемою фрезерування будемо називати набір цілих чисел
де
Одна і та ж схема фрезерування застосовується до всіх деталей. Після обчислення значень cuts_j~(1 \le j \le x) цю схему послідовно застосовуємо до кожної деталі.
Реалізація алгоритму
Оголосимо робочі масиви. Інформацію про деталі будемо зберігати в масиві , а схему фрезерування — в масиві .
int detail[10001][101], cuts[101];Читаємо вхідні дані.
scanf("%d %d %d %d", &w, &s, &x, &y);Читаємо інформацію про деталі.
for (i = 0; i < w; i++)
for (j = 0; j < x; j++)
scanf("%d", &detail[i][j]);Читаємо і обробляємо кроків програми фрезерування. Для кожної позиції значення cuts[j] буде позначати максимальну глибину вирізу, виконаного на якомусь кроці.
for (i = 0; i < s; i++)
for (j = 0; j < x; j++)
{
scanf("%d", &val);
if (val > cuts[j]) cuts[j] = val;
}Максимально можлива висота заготовки дорівнює . Фрезерна головка в позиції опускається на глибину cuts[j]. Отже, після фрезерування в позиції у -ї деталі залишиться висота, рівна
for (i = 0; i < w; i++)
{
for (j = 0; j < x; j++)
printf("%d ", min(detail[i][j], y - cuts[j]));
printf("\n");
}