-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathproblem0011.cpp
85 lines (77 loc) · 2.21 KB
/
problem0011.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/*
* Find the largest product of 4 adjacent integers in a 20x20 grid. The integers can be located vertically,
horizontally, and diagonally
*/
#include <iostream>
using namespace std;
int findLargest(int[][20]);
int maxLine(int[][20], int, int);
int maxDiag(int[][20], int, int);
int main(void) {
int grid[20][20];
for (int i = 0; i < 20; ++i) {
for (int j = 0; j < 20; ++j) {
cin >> grid[i][j];
}
}
cout << findLargest(grid) << endl;
}
int findLargest(int grid[][20]) {
int max = 0;
int tmp1, tmp2;
for (int i = 0; i < 20; ++i) {
for (int j = 0; j < 20; ++j) {
tmp1 = maxLine(grid, i, j);
tmp2 = maxDiag(grid, i, j);
if (tmp1 > max) {
max = tmp1;
cout << max << endl;
}
if (tmp2 > max) {
max = tmp2;
cout << max << endl;
}
}
}
return max;
}
int maxLine(int grid[][20], int i, int j) {
int max = 0;
if (i >= 3) {
int up = grid[i][j] * grid[i-1][j] * grid[i-2][j] * grid[i-3][j];
if (up > max) max = up;
}
if (i <= 16) {
int down = grid[i][j] * grid[i+1][j] * grid[i+2][j] * grid[i+3][j];
if (down > max) max = down;
}
if (j >= 3) {
int left = grid[i][j] * grid[i][j-1] * grid[i][j-2] * grid[i][j-3];
if (left > max) max = left;
}
if (j <= 16) {
int right = grid[i][j] * grid[i][j+1] * grid[i][j+2] * grid[i][j+3];
if (right > max) right = max;
}
return max;
}
int maxDiag(int grid[][20], int i, int j) {
int max = 0;
if (i >= 3 && j >= 3) {
int upL = grid[i][j] * grid[i-1][j-1] * grid[i-2][j-2] * grid[i-3][j-3];
if (upL > max) max = upL;
}
if (i >= 3 && j <= 16) {
int upR = grid[i][j] * grid[i-1][j+1] * grid[i-2][j+2] * grid[i-3][j+3];
if (upR > max) max = upR;
}
if (i <= 16 && j >= 3) {
int dnL = grid[i][j] * grid[i+1][j-1] * grid[i+2][j-2] * grid[i+3][j-3];
if (dnL > max) max = dnL;
}
if (i <= 16 && j <= 16) {
int dnR = grid[i][j] * grid[i+1][j+1] * grid[i+2][j+2] * grid[i+3][j+3];
if (dnR > max) max = dnR;
}
return max;
}