The problem can be found here : http://projecteuler.net/problem=11
Yesterday I saw project Euler and I am hooked up to it. I made a code to solve problem 11 but for some reason that is not visible to me the answer is coming out to be wrong.
Can anybody read my code and suggest anything?
#include <iostream>
using namespace std;
int input [20][20] = {
{8,2,22,97,38,15,0,40,0,75,4,5,7,78,52,12,50,77,91,8},
{49,49,99,40,17,81,18,57,60,87,17,40,98,43,69,48,4,56,62,0},
{81,49,31,73,55,79,14,29,93,71,40,67,53,88,30,3,49,13,36,65},
{52,70,95,23,4,60,11,42,69,24,68,56,1,32,56,71,37,2,36,91},
{22,31,16,71,51,67,63,89,41,92,36,54,22,40,40,28,66,33,13,80},
{24,47,32,60,99,3,45,2,44,75,33,53,78,36,84,20,35,17,12,50},
{32,98,81,28,64,23,67,10,26,38,40,67,59,54,70,66,18,38,64,70},
{67,26,20,68,2,62,12,20,95,63,94,39,63,8,40,91,66,49,94,21},
{24,55,58,5,66,73,99,26,97,17,78,78,96,83,14,88,34,89,63,72},
{21,36,23,9,75,0,76,44,20,45,35,14,0,61,33,97,34,31,33,95},
{78,17,53,28,22,75,31,67,15,94,3,80,4,62,16,14,9,53,56,92},
{16,39,5,42,96,35,31,47,55,58,88,24,0,17,54,24,36,29,85,57},
{86,56,0,48,35,71,89,7,5,44,44,37,44,60,21,58,51,54,17,58},
{19,80,81,68,5,94,47,69,28,73,92,13,86,52,17,77,4,89,55,40},
{4,52,8,83,97,35,99,16,7,97,57,32,16,26,26,79,33,27,98,66},
{88,36,68,87,57,62,20,72,3,46,33,67,46,55,12,32,63,93,53,69},
{4,42,16,73,38,25,39,11,24,94,72,18,8,46,29,32,40,62,76,36},
{20,69,36,41,72,30,23,88,34,62,99,69,82,67,59,85,74,4,36,16},
{20,73,35,29,78,31,90,1,74,31,49,71,48,86,81,16,23,57,5,54},
{1,70,54,71,83,51,54,69,16,92,33,48,61,43,52,1,89,19,67,48}
};
/* if element is a[i][j], its diagonal to the right is a[i+1][j+1]
if element is a[i][j], its diagonal to the left is a[i-1][j-1]
IF element is a[i][j], the element below it is a[i+1][j]
IF element is a[i][j], the element on right of it is a[i][j+1]
*/
/*
approach:
=> find the greatest product of diagonals
=> find the greatest prodct of elements below each other
=> find the greatest prodct of element on right of each other
=> compare them
*/
int main(void)
{
unsigned long hr=0,hb=0,hdr=0, hdl=0;
//hr is the highest product on the right side traversal
//similraly for others
//for diagonal right
for(int i =0; i<17;i++) //going from 0 to 16 so that we dont land up beyond the array for (i+1),(j+1) etc
{
for(int j=0;j<17;j++)
{
if(input[i][j]*input[i+1][j+1]*input[i+2][j+2]*input[i+3][j+3] > hdr)
{
hdr = input[i][j]*input[i+1][j+1]*input[i+2][j+2]*input[i+3][j+3];
}
}
}
for(int i =19; i>=3;i--) //for diagonal left
{
for(int j=19;j>=3;j--)
{
if(input[i][j]*input[i-1][j-1]*input[i-2][j-2]*input[i-3][j-3] > hdl)
{
hdl = input[i][j]*input[i-1][j-1]*input[i-2][j-2]*input[i-3][j-3];
}
}
}
for(int i =0; i<17;i++) //for elements below each other
{
for(int j=0;j<20;j++)
{
if(input[i][j]*input[i+1][j]*input[i+2][j]*input[i+3][j] > hb)
{
hb = input[i][j]*input[i+1][j]*input[i+2][j]*input[i+3][j];
}
}
}
for(int i =0; i<20;i++) //on right
{
for(int j=0;j<17;j++)
{
if(input[i][j]*input[i][j+1]*input[i][j+2]*input[i][j+3] > hr)
{
hr = input[i][j]*input[i][j+1]*input[i][j]*input[i][j+3];
}
}
}
if(hdr>hb && hdr > hr && hdr>hdl )
{
cout<<hdr<<endl;
}
else if (hb > hdr && hb > hr && hb>hdl)
{
cout<<hb<<endl;
}
else if(hr>hb && hr> hdr && hr > hdl)
{
cout<<hr<<endl;
}
else
{
cout<<hdl<<endl;
}
return 0;
}
This is the correct code that will work. I suggest anybody trying this problem gives some time to actually see the pattern by pencil and paper. The problem is very easy in itself.