Freze dəzgahları#7714

Freze dəzgahları (Həll təhlili)

Frezerləmə proqramı addımdan ibarətdir. Tutaq ki, -ci (1 \le i \le s) addımda j~(1 \le j \le x) sütununda səthin üzərindən m_{ij} qalınlıqda bir təbəqə çıxarılır. Beləliklə, açıq-aşkar görünür ki, sütununda ümumilikdə çıxarılan təbəqə miqdarı belə olacaq:

max(m_{1j}, m_{2j}, ..., m_{sj})

Frezerləmə sxemini isə tam ədədlərdən ibarət

(cuts_1, cuts_2, ..., cuts_x),

şəkilində təyin edəcəyik, burada

cuts_j = max(m_{1j}, m_{2j}, ..., m_{sj}), 1 \le j \le x

Eyni frezerləmə sxemi bütün detallara tətbiq olunur. cuts_j~(1 \le j \le x) dəyərləri hesablandıqdan sonra bu sxemi ardıcıllıqla hər detala tətbiq edirik.

Alqoritmin realizasiyası

İşçi massivlər elan edək. Detallar haqqında məlumatı massivində, frezerləmə sxemini isə massivində saxlayacağıq.

int detail[10001][101], cuts[101];

Giriş məlumatlarını oxuyuruq.

scanf("%d %d %d %d", &w, &s, &x, &y);

detallarla bağlı məlumatları oxuyuruq.

for (i = 0; i < w; i++)
for (j = 0; j < x; j++)
  scanf("%d", &detail[i][j]);

Frezerləmə proqramının addımlarını oxuyub işləyirik. Hər mövqedə , cuts[j] dəyəri hansısa addımda yerinə yetirilən maksimum dərinliyi göstərəcək.

for (i = 0; i < s; i++)
for (j = 0; j < x; j++)
{
  scanf("%d", &val);
  if (val > cuts[j]) cuts[j] = val;
}

Boşluğun mümkün maksimum hündürlüyü -dir. Frezer başlığı mövqeyində cuts[j] dərinliyinə qədər aşağı düşür. Beləliklə, -ci detala ferezerləndikdən sonra mövqeyində qalan hündürlük belə olacaq:

min(detail[i][j], y - 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");
}