深搜dfs系列之洛谷P1123 取数游戏

话不多说上链接

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);不选这个点,往下个点走
    	
    }
   }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值