Supponiamo di avere una matrice quadrata di dimensione N (N < = 50) e gli elementi adiacenti non includono le diagonali.Qual è il modo più veloce per trovare la somma maggiore di elementi adiacenti M in una matrice
Come posso trovare la somma più grande tra M elementi adiacenti, dato M?
Ad esempio, prendere questa matrice 4x4:
Matrix: For M = 3 For M = 4
3 1 5 2 3 1 5 2 3 1 5 2
2 6 1 3 2 [6] 1 3 2 [6] 1 3
1 4 4 2 1 [4][4] 2 1 [4] 4 2
5 3 2 7 5 3 2 7 [5][3] 2 7
Biggest = 14 Biggest = 18
tentato di eseguire questo modo, ma dopo una certa dimensione, è molto lenta.
#include <bits/stdc++.h>
using namespace std;
int mat[51][51];
int mark[51][51];
int m, n;
int biggest;
void search(int row, int column, int sum, int steps){
if(row < 0 || row >= n || column < 0 || column >= n || mark[row][column]) {
return;
}
sum += mat[row][column];
mark[row][column] = 1;
if(steps == m){
if(biggest < sum) biggest = sum;
}
else{
search(row - 1, column, sum, steps+1);
search(row + 1, column, sum, steps+1);
search(row, column + 1, sum, steps+1);
search(row, column - 1, sum, steps+1);
}
mark[row][column] = 0;
}
int main(){
memset(mat, 0, sizeof(mat));
memset(mark, 0, sizeof(mark));
biggest = 0;
scanf("%d", &n);
scanf("%d", &m);
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
scanf("%d", &mat[i][j]);
}
}
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
search(i, j, 0, 1);
}
}
printf("%d", biggest);
return 0;
}
Quanto e 'grande M? M <= 50? –
Questo è un algoritmo di backtracking per risolvere il problema, non è vero? – jogo
Se M == 5, un insieme di cinque numeri disposti in una forma "+" sarebbe accettabile? Per quanto posso dire, il tuo programma attuale non consente una tale forma, in quanto non può essere creato da movimenti orizzontali e verticali senza rivedere un elemento di matrice. –