Call for help (Numpad) OIS


#1

Ho sottomesso questo codice durante le gare, ma ho ottenuto 0/100 :confounded::confounded::confounded:

#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
ifstream leggi("input.txt");
ofstream scrivi ("output.txt");

int main()
{
	string s;
	leggi>>s;
	long int tot=0;
	int x[10]={3,0,0,0,1,1,1,2,2,2};
	int y[10]={1,0,1,2,0,1,2,0,1,2};
	
	for(int i=0;i<s.length()-1;i++){
		int p1=(int)s.at(i)-'0';
		int p2=(int)s.at(i+1)-'0';
		tot+=abs(x[p1]-x[p2]);
		tot+=abs(y[p1]-y[p2]);
	}
	tot+=s.length();
	scrivi<<tot;
}

Mi sapreste dire dove sbaglio?


#2

Hai considerato che la formica parte sempre da 0 anche se non lo deve premere? Anche noi abbiamo fatto lo stesso errore in gara.


#3

Non ho capito (non mi sono sforzato a capire, mi dispiace) come funziona il tuo codice, ma ti posso spiegare la strategia che il mio gruppo ha adottato nella gara: abbiamo creato un array bidimensionale (o matrice) “int array[4][3];”, che contiene i valori della tastiera, e, ciascun indice nell’array, indica una posizione (ad esempio, array[0][0], contiene “1”, quindi la posizione X di “1” è 0, e lo stesso per la Y). Poi abbiamo considerato che la formica ha una X e una Y (all’inizio: 1, 3), e bisogna contare i salti da fare per raggiungere la posizione X e Y del numero da premere + 1 salto per premere il tasto. I salti da fare sono (X2 - X1) + (Y2 - Y1), dove X2 è maggiore o uguale a X1, e lo stesso per Y2 e Y1. Le X da considerare sono quelle del numero da premere, e la X attuale della formica, lo stesso per la Y. Se hai altre domande, ti invito a chiedere, speialmente perché non credo che io sia stato molto chiaro… del resto, buona fortuna nel risolvere il problema :slight_smile: !