Project Euler > Problem 83 > Path sum: four ways (Java Solution)

Problem:

NOTE: This problem is a significantly more challenging version of Problem 81.

In the 5 by 5 matrix below, the minimal path sum from the top left to the bottom right, by moving left, right, up, and down, is indicated in bold red and is equal to 2297.


131 673 234 103 18
201 96 342630 803 746 422 111
537 699 497 121 956
805 732 524 37 331


Find the minimal path sum, in matrix.txt (right click and 'Save Link/Target As...'), a 31K text file containing a 80 by 80 matrix, from the top left to the bottom right by moving left, right, up, and down.


Solution:

100

Code:
The solution may include methods that will be found here: Library.java .

public interface EulerSolution{

public String run();

}
/* 
* Solution to Project Euler problem 33
* By Nayuki Minase
*
* http://nayuki.eigenstate.org/page/project-euler-solutions
* https://github.com/nayuki/Project-Euler-solutions
*/


public final class p033 implements EulerSolution {

public static void main(String[] args) {
System.out.println(new p033().run());
}


/*
* Consider an arbitrary fraction n/d:
* Let n = 10 * n1 + n0 be the numerator.
* Let d = 10 * d1 + d0 be the denominator.
* As stated in the problem, we need 10 <= n < d < 100.
* We must disregard trivial simplifications where n0 = d0 = 0.
*
* Now, a simplification with n0 = d0 is impossible because:
* n1 / d1 = n / d = (10*n1 + n0) / (10*d1 + n0).
* n1 * (10*d1 + n0) = d1 * (10*n1 + n0).
* 10*n1*d1 + n1*n0 = 10*d1*n1 + d1*n0.
* n1*n0 = d1*n0.
* n1 = d1.
* This implies n = d, which contradicts the fact that n < d.
* Similarly, we cannot have a simplification with n1 = d1 for the same reason.
*
* Therefore we only need to consider the cases where n0 = d1 or n1 = d0.
* In the first case, check that n1/d0 = n/d; in the second case, check that n0/d1 = n/d.
*/
public String run() {
int numer = 1;
int denom = 1;
for (int d = 10; d < 100; d++) {
for (int n = 10; n < d; n++) {
int n0 = n % 10, n1 = n / 10;
int d0 = d % 10, d1 = d / 10;
if (n1 == d0 && n0 * d == n * d1 || n0 == d1 && n1 * d == n * d0) {
numer *= n;
denom *= d;
}
}
}
return Integer.toString(denom / Library.gcd(numer, denom));
}

}


No comments :

Post a Comment

Follow Me

If you like our content, feel free to follow me to stay updated.

Subscribe

Enter your email address:

We hate spam as much as you do.

Upload Material

Got an exam, project, tutorial video, exercise, solutions, unsolved problem, question, solution manual? We are open to any coding material. Why not upload?

Upload

Copyright © 2012 - 2014 Java Problems  --  About  --  Attribution  --  Privacy Policy  --  Terms of Use  --  Contact