java j8 problem

7 09 2007
/*
* J8. Pentru 3


java j2 problem

7 09 2007
/*
 * J2. Sa se determine toate descompunerile unui numar natural
 * n > 0 in suma de termeni distincti ai sirului lui Fibonacci
 */

import java.io.*;
import java.util.Scanner;
import java.util.Vector;
import java.util.List; // pt a folosi doar metodele noi de adaugare/accesare elem vector
import static java.lang.System.*;

class j2 {

	//private static Scanner intrareTastatura = null; // stream de citire de la tastatura
	private static Scanner intrareFisier = null; // stream de citire din fisier
	private static PrintWriter iesireFisier = null; // stream de scriere in fisire

	private static int n = -1; // nr citit din fisier
	private static int nrSol = 0; // nr de solutii LONG dc le las pe toate... si nu le ordonez...

	private static int[] fib;

	private static int[] convLaIntPrimitiv (Integer[] t)
	{
		int[] a = new int[t.length];
		for (int i = 0; i  n) return false;
		return true;
	}

	private static boolean sol (int[] x, int k)
	{
		int sumaTotala = 0;
		for (int i = 0; i  -1) // cat timp n-am iesit din vector
		{
			++x[k]; // trec la urm valoare din domeniu
			if (x[k] > nrMaxim) --k; // trec inapoi pe poz precedenta din vector dc am ajuns la sf domeniului pt acest k
			else if (valid(x, k))
			{
				if (sol(x, k)) afisare(x, k);
				else x[++k] = -1; // trec la urm pozitie si initializez cu prima val din afara dom
			}
		}

		iesireFisier.println(nrSol + " solutii gasite");
		out.println(nrSol + " solutii gasite");
	}

	private static void operatii () throws FileNotFoundException, IOException, Exception
	{
		if (intrareFisier.hasNextInt()) n = intrareFisier.nextInt(); // pt intrare tastaturea se fol intrareTastatura
		if (!(n > 0)) // dc n exista si dc n >= 1
		{
			err.println("Fisierul de intrare trebuie sa contina un numar intreg n >= 1");
			exit(-1); // sau System.
		}

		fib = convLaIntPrimitiv(genereazaTermFib());
		backtracking();
	}

	public static void main(String[] args)
	{
		if (args.length != 2)
		{
			err.println("Argumente: fisierIntrare si fisierIesire !");
			exit(-1);
		}
		try
		{
			intrareFisier = new Scanner(new BufferedReader(new FileReader(args[0])));
			iesireFisier = new PrintWriter(new BufferedWriter(new FileWriter(args[1])));
			//intrareTastatura = new Scanner(new BufferedReader(new InputStreamReader(in)));

			operatii();
		}
		catch (FileNotFoundException e)
		{
			err.println("EROARE CATASTROFALA: imposibli de gasit fisierul");
			e.printStackTrace();
		}
		catch (IOException e)
		{
			err.println("EROARE APOCALIPTICA: operatie intrareFisier/iesireFisier esuata lamentabil");
			e.printStackTrace();
		}
		catch (Exception e)
		{
			err.println("EROARE 821098313: adica necunoscuta");
			e.printStackTrace();
		}
		finally
		{
			if (intrareFisier != null) intrareFisier.close();
			if (iesireFisier != null) iesireFisier.close();
		}
	}
}


Schema simpla de backtracking

7 09 2007
void backtracking () // functia de backtracking
{
	int nrMaxim // = maxim posibil pt un elem
	int lungime // = lungimea vectorului
	int[] x = new int[lungime];

	int k = 0;
// initializ cu prima poz din vector
	x[k] = -1;
// initializ cu primu elem din afara domeniului

	while (k > -1)
// cat timp n-am iesit din vector
	{
		++x[k];
// trec la urm valoare din domeniu
		if (x[k] > nrMaxim) --k;
// trec inapoi pe poz precedenta
		else if (valid(x, k))
		{
			if (sol(x, k)) afisare(x, k);
			else x[++k] = -1;
 // trec la urm pozitie si initializez cu prima val din afara dom
		}
	}
}