方向数组
方向数组常应用于搜索算法中,在c/c++中可以用二维数组来表示方向。例如二维数组a[k][n]
含义就是方向数组里面储存了k个向量,而n则代表每个向量有n维(n一般为2)。下面我们由下图来讲解方向数组如何控制方向。
上图是(x,y)这个点八个方向的坐标,在c/c++中x和y并不是我们数学中的坐标系而是数组的行数(x对应行数)和列数(y对应列数)。
例题
解析
由本题题意可知我们要求这一堆数字中连续四个数字(不同方向)相乘最大值,我们就以图中标红的第一个数字26为例,可以看出26为起点一共有八个方向(上下,左右,右上左下,左上右下),但我们仔细观察可以发现我们从14这个数字观察它的左上方向和26数字的右下方向数字乘积一样,所以我们最后总结以26为起始的数字方向共有四个方向(下,右,右下,左下)
代码编写
#include <stdio.h>
#define max_n 20
int grid[max_n + 5][max_n + 5];
int dir[4][2] = {{0, 1}, {1, 1}, {1, 0}, {1, -1}};/*定义方向数组*/
int calc(int x, int y) {
int ans = 1;
for(int i = 0; i < 4; i++) {
int p = 1;
for(int j = 0; j < 4; j++) {
int dx = x + j * dir[i][0];
int dy = y + j * dir[i][1];
if(dx < 0 || dx >= 20) break;
if(dy < 0 || dy >= 20) break;
p *= grid[dx][dy];
}
if(p > ans) ans = p;
}
return ans;
}
int main() {
for(int i = 0; i < max_n; i++) {
for(int j = 0; j < max_n; j++) {
scanf("%d", &grid[i][j]); /*读入数据*/
}
}
int ans;
for(int i = 0; i < max_n; i++) {
for(int j = 0; j < max_n; j++) {
int p = calc(i, j);
if(p > ans) ans = p;
}
}
printf("%d",ans);
}