fib frog

2
public class fibfrog{ static int f(int n, int [] A){ if (n<=2) return 1;//moze se odmah skociti int[] dostupan = new int[n]; dostupan[0] = A[0]; dostupan[1] = A[1]; int d = 26;//dovoljno je prvih 26 clanova fibonacijevog int[] niz = new int[d]; niz[0] = 0; niz[1] = 1; for(int i = 2;i<d;i++){ niz[i] = niz[i-1]+niz[i-2];//formiramo niz if (niz[i]-1 == n) return 1;//ako se odmah sa lijeve obale moze skociti na desnu if((niz[i]-1<n)&&(A[niz[i]-1]==1))//moze se skociti na list koji se nalazi na mjestu niz[i]-1 odmah sa obale dostupan[niz[i]-1] = 1; } //for(int i = 0; i < n; i++)System.out.println(dostupan[i]); int min = Integer.MAX_VALUE; for (int i = 0; i < n; i++){ if (dostupan[i] == 0) //ne moze se doci do nje continue; // System.out.println("DFDFD "+i+"dostupan> "+dostupan[i]); for(int j = 2; j < d;j++){ int sljedeca = i+niz[j];//sljedeca pozicija od i=-te if (sljedeca == n){//stigao je na drugu obalu if(dostupan[i]+1<min)//ako je blizi od prethodnog najblizeg min = dostupan[i] + 1; // System.out.println("DFDFD "+i+"min> "+min); break; } if (sljedeca > n || A[sljedeca] == 0)//ako smo presisali n, ili ako ce nagaziti tamo gdje nije list { continue; } if (dostupan[sljedeca] == 0 || //pretpostavka je da je A[sljedeca] = 1 dostupan[sljedeca] > niz[i] + 1)//ako nikad nije bio na toj poziciji ili se do te pozicije moglo doci sa vise koraka nego niz[i]+1 { dostupan[sljedeca] = dostupan[i] + 1; } } } if(min == Integer.MAX_VALUE) //nije nista nasao return -1; else return min;

Upload: draganmatke

Post on 14-Apr-2016

9 views

Category:

Documents


2 download

DESCRIPTION

fibfrog solution codility

TRANSCRIPT

Page 1: Fib Frog

public class fibfrog{

static int f(int n, int [] A){

if (n<=2) return 1;//moze se odmah skociti

int[] dostupan = new int[n];

dostupan[0] = A[0];

dostupan[1] = A[1];

int d = 26;//dovoljno je prvih 26 clanova fibonacijevog

int[] niz = new int[d];

niz[0] = 0;

niz[1] = 1;

for(int i = 2;i<d;i++){

niz[i] = niz[i-1]+niz[i-2];//formiramo niz

if (niz[i]-1 == n) return 1;//ako se odmah sa lijeve

obale moze skociti na desnu

if((niz[i]-1<n)&&(A[niz[i]-1]==1))//moze se

skociti na list koji se nalazi na mjestu niz[i]-1 odmah sa obale

dostupan[niz[i]-1] = 1;

}

//for(int i = 0; i < n; i++)System.out.println(dostupan[i]);

int min = Integer.MAX_VALUE;

for (int i = 0; i < n; i++){

if (dostupan[i] == 0) //ne moze se doci do nje

continue;

// System.out.println("DFDFD "+i+"dostupan> "+dostupan[i]);

for(int j = 2; j < d;j++){

int sljedeca = i+niz[j];//sljedeca pozicija od i=-te

if (sljedeca == n){//stigao je na drugu obalu

if(dostupan[i]+1<min)//ako je blizi od prethodnog

najblizeg

min = dostupan[i] + 1;

// System.out.println("DFDFD "+i+"min> "+min);

break;

}

if (sljedeca > n || A[sljedeca] == 0)//ako smo

presisali n, ili ako ce nagaziti tamo gdje nije list

{

continue;

}

if (dostupan[sljedeca] == 0 || //pretpostavka je da je

A[sljedeca] = 1

dostupan[sljedeca] > niz[i] + 1)//ako nikad nije bio na

toj poziciji ili se do te pozicije moglo doci sa vise koraka nego

niz[i]+1

{

dostupan[sljedeca] = dostupan[i] + 1;

}

}

}

if(min == Integer.MAX_VALUE) //nije nista nasao

return -1;

else return min;

Page 2: Fib Frog

}

public static void main(String[] args){

int[] A = {0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0};

int n = 11;

System.out.println(f(n,A));

}

}