Fuorigioco 50/100

Ciao,
sto tentado di risolvere il problema “fuorigoco” ma totalizzo solamente 50/100.
Qualcuno mi sa dire dove sbaglio?

Grazie mille

#include<stdio.h>
#include<stdlib.h>

int d;
int nAttaccanti;
int nDifensori;
float difensori[3];
float attaccanti[3];

float calcola(int finale, int iniziale)
{
    return (float)((finale-iniziale)*d/10)+iniziale;
}

main()
{
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    
    int i,j;
    
    scanf("%d", &d);
    scanf("%d", &nAttaccanti);
    scanf("%d", &nDifensori);
    
    for(i=0; i<nAttaccanti; i++)
    {
        int xin, yin, xf, yf;
        scanf("%d%d%d%d", &xin, &yin, &xf, &yf);
        attaccanti[i]=calcola(yf, yin);
    }
    for(i=0; i<nDifensori; i++)
    {
        int xin, yin, xf, yf;
        scanf("%d%d%d%d", &xin, &yin, &xf, &yf);
        difensori[i]=calcola(yf, yin);
    }
    
    int flag=1;
    
    for(i=0; i<nDifensori && flag; i++)
    {
        for(j=0; j<nAttaccanti && flag; j++)
        {
            if(attaccanti[j]<difensori[i])
                flag=0;
        }
    }
    
    if(flag)
        printf("R");
    else
        printf("F");
}

Ciao, non ho ancora risolto l esercizio al 100 ma ho fatto 70 modificando al volo il tuo codice.
Le considerazioni che ti suggerisco di fare è che per far avverare il fuorigioco l attacante deve avere una y minore del difensore più vicino al portiere quindi fare due cicli dove vai a controllare per ogni difensore è inutile.
Per la funzione calcola puoi anche mettere come parametri in ingresso direttamente i double/float cosi può avvenire il casting senza che lo devi specificare

 float calcola(float finale, float iniziale)
{
    return ((finale-iniziale)*d/10)+iniziale;
}

Appena riesco al 100 ti aggiorno, ti posto le modifiche che ho fatto ma avendole scritte al volo diciamo che non ho " scritto " in maniera decente.

#include<stdio.h>
#include<stdlib.h>
#include <bits/stdc++.h> 
using namespace std;
int d;
int nAttaccanti;
int nDifensori;
double difensori[3];
double attaccanti[3];
double at1[3];
double df1[3];

double calcola(double finale, double iniziale)
{
    return ((finale-iniziale)*d/10)+iniziale;
}

double calcola_1(double finale, double iniziale)
{
    return ((finale-iniziale)*d)+iniziale;
}


main()
{
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    
    int i,j;
    
    scanf("%d", &d);
    scanf("%d", &nAttaccanti);
    scanf("%d", &nDifensori);
    
    for(i=0; i<nAttaccanti; i++)
    {
        int xin, yin, xf, yf;
        scanf("%d%d%d%d", &xin, &yin, &xf, &yf);
        attaccanti[i]=calcola(yf, yin);
        at1[i]=calcola_1(yf,yin);
    }
    int mas = -1 , mas_1 = -1;;
    for(i=0; i<nDifensori; i++)
    {
        int xin, yin, xf, yf;
        scanf("%d%d%d%d", &xin, &yin, &xf, &yf);
        difensori[i]=calcola(yf, yin);
        df1[i]=calcola_1(yf,yin);
        if(mas < difensori[i]) mas = difensori[i];
        if(mas_1 < df1[i]) mas_1 = df1[i];
    }
    
    int flag=1;
    
    for(j=0; j<nAttaccanti && flag; j++)
    {
        if(attaccanti[j] < mas &&  at1[j]  < mas_1)
            flag=0;
    }
    
    
    if(flag)
        printf("R");
    else
        printf("F");
}
#include <bits/stdc++.h>

using namespace std;
#define MAXN 5
float attk[MAXN];

float calc (float inizio, float fine, float D){
	return ((fine - inizio ) * D /10 ) + fine;
}
int main(){
	// lettura e scrittura da file
	ifstream fin ("input.txt");
	ofstream fout("output.txt");
	int D,AT,DF;
	//fin >>  legge 
	fin >> D;
	fin >> AT;
	fin >> DF;
	// attaccanti 
	for(int i = 0,xi,yi,xf,yf; i < AT; i++){
		fin >> xi >> yi >> xf >> yf;
		attk[i] = calc(yi,yf,D);
	}
	// difensori 
	float YF = 1000;
	for(int i = 0,xi,yi,xf,yf; i < DF; i++){
		fin >> xi >> yi >> xf >> yf;
		// la funzione min restituisce il minimo valore tra gli argomenti della funzione
		YF = min(YF,calc(yi,yf,D)); 
	}
	// verifica 
	bool flag = 1;
	for(int i = 0; i < AT && flag; i++){
		if(attk[i] < YF ){
			flag = 0;
		}
	}
	// fout << stampa
	if(flag) fout << 'R';
	else fout << 'F';
}

Devo ancora capire come mai i codici che scrivo escono tutti attacati sul forum mentre su altre parti no, faccio ancora 70 ma dovevo scriverlo per bene il codice <.<
https://pastebin.com/8Q80hpUd

Ciao, probabilmente non è chiaro il testo: il fuorigioco avviene quando un attaccante si trova davanti a tutti i difensori mentre nel tuo codice controlli che l’attaccante si trovi davanti ad almeno uno dei difensori.
@zJack1342 se vuoi continuare a postare inutilmente codice sbagliato, almeno formattalo correttamente. Puoi usare il pulsante “testo preformattato” presente nell’editor o altrimenti puoi scrivere tre accenti gravi (```) prima e dopo del codice.

7 Mi Piace

Io non controllo uno qualsiasi. Controllo l ulitmo difensore della difesa (quello con la y minore ), cosi automaticamente superato quello ho superato tutti gli altri. Non credo che questo ragionamento non sia valido, potresti darmi conferma ?

Il problema che lo uso ma non worka. Incollo il codice lo evidenzio e premo sul pulsante <.<
Sul pastebin il codice è uguale identitco a come lo ho sul compilatore.

Lo ho postato ancora avesse qualche idea su come migliorarlo e fare 100, se la cosa da fastidio evito. Chiedo scusa nel caso avesse procurato fastdio postare il codice errato.

1 Mi Piace

Infatti era cosi, avevo sbagliato a fare il calcolo mettendo la somma della fine al posto di quella iniziale. Ho appena fatto 100

Deve essere cosi :

    float calc (float inizio, float fine, float D){
        return ((fine - inizio ) * D /10 ) + inizio;
    }

Assicurati di lasciare una riga vuota tra il codice ed eventuale testo che lo precede / segue

2 Mi Piace

Finalmente , grazie ^-^

#include <bits/stdc++.h>
 
using namespace std;
#define MAXN 5
float attk[MAXN];
 
float calc (float inizio, float fine, float D){
    return ((fine - inizio ) * D /10 ) + inizio;
}
int main(){
    // lettura e scrittura da file
    ifstream fin ("input.txt");
    ofstream fout("output.txt");
    int D,AT,DF;
    //fin >>  legge e assegna alla variabile il valore
    fin >> D;
    fin >> AT;
    fin >> DF;
    // attaccanti
    for(int i = 0,xi,yi,xf,yf; i < AT; i++){
        fin >> xi >> yi >> xf >> yf;
        attk[i] = calc(yi,yf,D);
    }
    // difensori
    float YF = 1000;
    for(int i = 0,xi,yi,xf,yf; i < DF; i++){
        fin >> xi >> yi >> xf >> yf;
        // la funzione min restituisce il minimo valore tra gli argomenti della funzione
        YF = min(YF,calc(yi,yf,D));
    }
    // verifica
    bool flag = 1;
    for(int i = 0; i < AT && flag; i++){
        if(attk[i] < YF ){
            flag = 0;
        }
    }
    // fout << stampa
    if(flag) fout << 'R';
    else fout << 'F';
}

@marco.rocchi Ho visto che ancora non lo hai risolto, questa è la soluzione in c++.
Si trova il difensore con la y più piccola, se un attaccante ha una y minore di questo difensore è fuorigioco altrimenti no.

Grazie mille!
Finalmente è risolto.