问题
有一个 5×5 的如下矩阵:
3 | 4 | 5 | 7 | 6 |
---|---|---|---|---|
6 | 2 | 8 | 4 | 12 |
7 | 12 | 4 | 8 | 3 |
1 | 9 | 5 | 10 | 7 |
8 | 5 | 6 | 5 | 2 |
矩阵中两个数字共用一条边,那么这两个数字相连。选一组相连的数字,这组数字相加的和不超过 24,并且这组数字所在格子构成的形状可以被一笔画出,请你计算出这组数字的乘积最大是多少。
例如:
这个形状可以被一笔画出。
这个形状不能被一笔画出。
答案
1920
思路
这题用dfs求解,dfs有4个参数,前两个为坐标,后面两个分别为数字相加的和,数字的乘积。
实现代码(c++)
#include <iostream>
using namespace std;
int a[5][5] = {3, 4, 5, 7, 6,
6, 2, 8, 4, 12,
7, 12, 4, 8, 3,
1, 9, 5, 10, 7,
8, 5, 6, 5, 2};
int vis[10][10];
int ans = 0;
int dir[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};
bool in(int x,int y){
return x>=0&&x<5&&y>=0&&y<5;
}
void dfs(int x,int y,int sum,int mul){
ans=max(ans,mul);
vis[x][y]=1;
for (int i=0;i<4;i++) {
int tx=x+dir[i][0];
int ty=y+dir[i][1];
if (in(tx,ty)&& !vis[tx][ty] && sum+a[tx][ty]<=24) {
vis[tx][ty]=1;
dfs(tx, ty, sum + a[tx][ty], mul * a[tx][ty]);
vis[tx][ty]=0;
}
}
}
int main() {
for (int i = 0; i < 5; ++i) {
for (int j = 0; j < 5; ++j) {
memset(vis, 0, sizeof vis);
dfs(i, j, a[i][j], a[i][j]);
}
}
cout << ans << endl;
return 0;
}