一个N×M的由非负整数构成的数字矩阵,你需要在其中取出若干个数字,使得取出的任意两个数字不相邻(若一个数字在另外一个数字相邻8个格子中的一个即认为这两个数字相邻),求取出数字和最大是多少。
DFS
import java.util.Scanner;
public class Main {
static int[][] vis = new int[9][9];
static int ans;
static int n,m;
static int[][] arr = new int[7][7];
static int max;
static int[] X = new int[] {0,1,-1,0,-1,-1,1,1};
static int[] Y = new int[] {1,0,0,-1,1,-1,-1,1};
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
while(T != 0){
max = 0;
ans = 0;
for (int j = 0; j < 9; j++) {
for(int k = 0;k < 9;k++) {
vis[j][k] = 0;
}
}
n = sc.nextInt();
m = sc.nextInt();
for(int j = 1;j<=n;j++) {
for (int k = 1; k <= m; k++) {
arr[j][k] = sc.nextInt();
}
}
dfs(1,1);
System.out.println(max);
T--;
}
}
public static void dfs(int x, int y) {
if(y >= m+1) {//换行搜索
dfs(x+1, 1);
return;
}
if(x >= n+1) {//搜索结束
max = Math.max(max, ans);
return;
}
dfs(x, y+1);//不取
if (vis[x][y] == 0) {//取
ans += arr[x][y];
for(int i = 0;i<8;i++) {
int newX = x+X[i];
int newY = y+Y[i];
vis[newX][newY]++;
}
dfs(x, y+1);
ans -= arr[x][y];
for(int i = 0;i<8;i++) {
int newX = x+X[i];
int newY = y+Y[i];
vis[newX][newY]--;
}
}
}
}