Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace ConsoleApp11
- {
- class Solution
- {
- long[] value1 = new long[16];
- char[] operation = new char[16];
- long[] value2 = new long[16];
- long[] result = new long[16];
- public Solution()
- {
- }
- public long[] Value1
- {
- get { return value1; }
- set { value1 = value; }
- }
- public long[] Value2
- {
- get { return value2; }
- set { value2 = value; }
- }
- public char[] Operation
- {
- get { return operation; }
- set { operation = value; }
- }
- public long[] Result
- {
- get { return result; }
- set { result = value; }
- }
- }
- class Program
- {
- long[] plateini = new long[6] { 1, 3, 3, 7, 10, 5};
- long result = 999;
- long bestdistance;
- int bestlevel;
- long[,] plate = new long[16, 16]; // 16*16 pour optimiser un peu
- Solution savesolution = new Solution();
- Solution bestsolution = new Solution();
- List<Solution> savesolution1 = new List<Solution>();
- void showSolution(int l)
- {
- int i;
- Console.WriteLine("******************\n");
- for (i = 6; i > l; i--)
- Console.WriteLine("{0} {1} {2} = {3}\n", savesolution1[i].Value1[i], savesolution1[i].Operation[i], savesolution1[i].Value2[i], savesolution1[i].Result[i]);
- //Console.WriteLine("{0} {1} {2} = {3}\n", bestsolution.Value1[i], bestsolution.Operation[i], bestsolution.Value2[i], bestsolution.Result[i]);
- Console.WriteLine("******************\n");
- Console.ReadKey();
- }
- void calculate(int l)
- {
- int i, j, k, n;
- long plate1, plate2;
- long distance;
- long r;
- distance = result - plate[l, 0];
- if (distance < 0)
- distance = -distance;
- if (distance <= bestdistance)
- {
- if (distance < bestdistance)
- {
- bestdistance = distance;
- bestsolution = savesolution;
- savesolution1.Add(savesolution);
- bestlevel = l;
- if (distance == 0)
- {
- showSolution(l);
- }
- }
- else // (distance==bestdistance)
- {
- if (l > bestlevel)
- {
- bestsolution = savesolution;
- savesolution1.Add(savesolution);
- bestlevel = l;
- if (distance == 0)
- showSolution(l);
- }
- }
- }
- if (l == 1)
- return;
- for (i = 0; i < l - 1; i++)
- {
- for (j = i + 1; j < l; j++)
- {
- plate1 = plate[l, i]; // prend 2 plates
- plate2 = plate[l, j]; // parmi les C(l,2)=(l*l-1)/2 possibles
- n = 1;
- for (k = 0; k < l; k++)
- {
- if (k != i && k != j)
- {
- plate[l - 1, n] = plate[l, k];
- n++;
- }
- }
- // attention si vous mettez l--; ici pour simplifier les "l-1" qui suivent, il faut mettre l++; apres pour retablir l pour la prochaine boucle
- plate[l - 1, 0] = plate1 + plate2;
- savesolution.Value1[l] = plate1;
- savesolution.Operation[l] = '+';
- savesolution.Value2[l] = plate2;
- savesolution.Result[l] = plate[l - 1, 0];
- calculate(l - 1);
- if (plate1 != 1 && plate2 != 1)
- {
- plate[l - 1, 0] = plate1 * plate2;
- // savesolution.Value1[l]=plate1; inutile car fait juste avant
- savesolution.Operation[l] = '*';
- // savesolution.Value2[l]=plate2; inutile car fait juste avant
- savesolution.Result[l] = plate[l - 1, 0];
- calculate(l - 1);
- if (plate1 >= plate2)
- {
- plate[l - 1, 0] = plate1 - plate2;
- if (plate[l - 1, 0] != 0)
- {
- // savesolution.Value1[l]=plate1;
- savesolution.Operation[l] = '-';
- // savesolution.Value2[l]=plate2;
- savesolution.Result[l] = plate[l - 1, 0];
- calculate(l - 1);
- }
- r = plate1 % plate2;
- if (r == 0)
- {
- plate[l - 1, 0] = plate1 / plate2;
- // savesolution.Value1[l]=plate1;
- savesolution.Operation[l] = '/';
- // savesolution.Value2[l]=plate2;
- savesolution.Result[l] = plate[l - 1, 0];
- calculate(l - 1);
- }
- }
- else
- {
- plate[l - 1, 0] = plate2 - plate1; // toujours superieur … 0
- savesolution.Value1[l] = plate2;
- savesolution.Operation[l] = '-';
- savesolution.Value2[l] = plate1;
- savesolution.Result[l] = plate[l - 1, 0];
- calculate(l - 1);
- r = plate2 % plate1;
- if (r == 0)
- {
- plate[l - 1, 0] = plate2 / plate1;
- // savesolution.Value1[l]=plate2;
- savesolution.Operation[l] = '/';
- // savesolution.Value2[l]=plate1;
- savesolution.Result[l] = plate[l - 1, 0];
- calculate(l - 1);
- }
- }
- }
- else if (plate1 >= plate2)
- {
- plate[l - 1, 0] = plate1 - plate2;
- if (plate[l - 1, 0] != 0)
- {
- // savesolution.Value1[l]=plate1;
- savesolution.Operation[l] = '-';
- // savesolution.Value2[l]=plate2;
- savesolution.Result[l] = plate[l - 1, 0];
- calculate(l - 1);
- }
- }
- else
- {
- plate[l - 1, 0] = plate2 - plate1; // toujours superieur … 0
- savesolution.Value1[l] = plate2;
- savesolution.Operation[l] = '-';
- savesolution.Value2[l] = plate1;
- savesolution.Result[l] = plate[l - 1, 0];
- calculate(l - 1);
- }
- }
- }
- }
- static void Main(string[] args)
- {
- int i;
- Program prog = new Program();
- for (i = 0; i < 6; i++) // v‚rifie que le Result n'est pas d‚j… dans les 6 nombres
- {
- if (prog.result == prog.plateini[i])
- {
- Console.WriteLine("Solution already in the 6 numbers : %u\n", prog.result);
- Console.WriteLine("Press a key to finish\n");
- }
- }
- for (i = 0; i < 6; i++) // initialise plate[,]
- prog.plate[6, i] = prog.plateini[i];
- prog.bestdistance = Int32.MaxValue; //distance maximal
- prog.bestlevel = Int32.MaxValue;
- prog.calculate(6);
- if (prog.bestdistance > 0)
- {
- Console.WriteLine("nearest solution :\n");
- prog.showSolution(prog.bestlevel);
- }
- }
- }
- }
Add Comment
Please, Sign In to add comment