Due scatole

Correttore online – Facili

Sul tavolo ci sono due scatole vuote: la prima ha dimensioni A1×B1×C1 e la seconda A2×B2×C2, espresse come base×altezza×profondità in una qualche unità di misura.

Si vuole determinare se una delle due scatole può essere contenuta nell’altra, sapendo che le due scatole possono ruotare (di 90° alla volta) attorno a ciascuno dei propri lati, per cui le facce delle due scatole sono sempre parallele oppure ortogonali.

Tali scatole hanno spessore nullo e, quindi, una può essere contenuta nell’altra anche a parità di lunghezza di alcuni dei lati (mentre nella realtà ciò non è possibile).

Per esempio, la scatola di dimensioni 3×9×7 è contenuta nella scatola 7×5×10 facendo combaciare i due lati lunghi 7 e allineando il lato lungo 3 con quello lungo 5 (e quindi quello lungo 9 con quello lungo 10).
Non è invece contenuta nella scatola 5×5×10 perché il lato lungo 9 deve necessariamente essere allineato con quello lungo 10 e, quindi, il lato lungo 7 non può essere allineato con uno dei due lati rimanenti, ciascuno di lunghezza pari a 5.

Scrivere un programma che riceve le dimensioni A1×B1×C1 e A2×B2×C2 e determina se una delle due scatole può essere contenuta nell’altra.

Dati di input

Il file input.txt è composto da due righe.

  • La prima riga contiene i tre numeri interi A1, B1 e C1 separati da uno spazio.
  • La seconda riga contiene i tre numeri interi A2, B2 e C2 separati da uno spazio.

Tutti i numeri sono positivi e non superiori a 1000.

Dati di output

Il file output.txt è formato da una sola riga determinata come segue:

  • se le due scatole sono uguali, il file deve contenere la scritta Scatole uguali;
  • se la prima scatola può essere contenuta nella seconda, il file deve contenere la scritta Prima scatola piu’ piccola della seconda;
  • se la seconda scatola può essere contenuta nella prima, il file deve contenere la scritta Prima scatola piu’ grande della seconda;
  • in tutti gli altri casi, il file deve contenere la scritta Scatole non confrontabili.

Esempi di input/output

input.txt output.txt
1 2 3
3 2 1
Scatole uguali
2 2 3
3 2 1
Prima scatola più grande della seconda
2 2 3
3 2 3
Prima scatola più piccola della seconda
3 4 5
2 4 6
Scatole non confrontabili

Autore/i: A.S. Stankevich, ACM ICPC Team St. Petersburg State University of Information technology, Mechanics and Optics.


/*
    www.valcon.it
	OII - Esercizi facili - Due scatole
*/

#include

#define UGUALI   0
#define PRIMA_G  1
#define PRIMA_P  2
#define NONCONFR 3

void ordina(int *a, int *b)
{
	if(*a > *b)
	{
		int temp=*a;
		*a=*b;
		*b=temp;    
	}
}

int main()
{
	int   PRIMA[3],
	    SECONDA[3];
	int stato, i;
	
	FILE* fin =fopen( "input.txt","r");
	FILE* fout=fopen("output.txt","w");
	
	fscanf(fin, "%d %d %d %d %d %d", &PRIMA[0],&PRIMA[1],&PRIMA[2],&SECONDA[0],&SECONDA[1],&SECONDA[2]);
	
	ordina(  &PRIMA[0],   &PRIMA[1]);  ordina(  &PRIMA[1],   &PRIMA[2]);  ordina(  &PRIMA[0],   &PRIMA[1]);
	ordina(&SECONDA[0], &SECONDA[1]);  ordina(&SECONDA[1], &SECONDA[2]);  ordina(&SECONDA[0], &SECONDA[1]);
	
	stato=UGUALI;	
	for(i=0; i < 3; i++)
	{
        switch(stato)
		{
		    case UGUALI  :      if(PRIMA[i] > SECONDA[i]) stato= PRIMA_G;
						   else if(PRIMA[i] < SECONDA[i]) stato= PRIMA_P; break;
		    case PRIMA_G :      if(PRIMA[i] < SECONDA[i]) stato=NONCONFR; break;
		    case PRIMA_P :      if(PRIMA[i] > SECONDA[i]) stato=NONCONFR; break;
		    case NONCONFR:                                                break;
	    }
    }
	
		 if(stato == UGUALI  ) fprintf(fout, "Scatole uguali"                         );
	else if(stato == PRIMA_G ) fprintf(fout, "Prima scatola più grande della seconda" );
	else if(stato == PRIMA_P ) fprintf(fout, "Prima scatola più piccola della seconda");
	else if(stato == NONCONFR) fprintf(fout, "Scatole non confrontabili"              );
	
	return 0;
}