话不多说上链接
P1123 取数游戏 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
这道题的难点在于如何深搜,一旦选择了一个数字,他周围一圈都无法选择 了。我们逆向思维每次选择一个数在选取数字的时候我们先对其四周进行遍历,看看它的四周是否有被标记的数字,如果有就不选择他,没有选取它,并使用标记数组将其标为已读true然后选择下一个数字重复上述过程。在选择数字时我们选择的顺序是先横着选择再竖着选择。上代码
import java.sql.SQLIntegrityConstraintViolationException;
import java.text.DateFormatSymbols;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;
import java.util.function.IntPredicate;
public class Main{
public static void main(String args[]) {
Scanner sc=new Scanner(System.in);
int a=sc.nextInt();
while(a>0) {
a--;
aa=sc.nextInt();
bb=sc.nextInt();
cc=new int[aa][bb];
jiance=new boolean[aa][bb];
int c,d;
for(c=0;c<aa;c++) {
for(d=0;d<bb;d++) {
cc[c][d]=sc.nextInt();
}
}
ans=0;//每次初始化ans来获取最大值
dfs(0,0,0);//从第一个点出发
System.out.println(ans);
}
}
public static int aa,bb;
public static int[] xx1= {-1,-1,-1,0,0,1,1,1};
public static int[] yy1= {-1,0,1,-1,1,-1,0,1};
public static int[][] cc;
public static boolean[][] jiance;
public static int ans,qqq=0;
public static void dfs(int x,int y,int a) {
if(x>aa-1) {//说明已经走完了最后一个点
ans=Math.max(a, ans);
return;
}
int xx=x;//下一个将决定选与不选的点的坐标
int yy=y+1;//
if(yy>bb-1) {
xx++;
yy=0;
}
int c=0;
for(int i=0;i<8;i++) {判断将选点的四周是否被标记
int xx2=xx1[i]+x;
int yy2=yy1[i]+y;
if(xx2>=0&&xx2<aa&&yy2>=0&&yy2<bb&&jiance[xx2][yy2]==true) {
c=1;
}
}
if(c==0) {
jiance[x][y]=true;
dfs(xx, yy, a+cc[x][y]);选取并标记
jiance[x][y]=false;//回溯
}
dfs(xx, yy, a);不选这个点,往下个点走
}
}