【Java】蓝桥杯PREV - 4 剪格子

本文介绍了如何使用深度优先搜索(DFS)解决蓝桥杯比赛中的剪格子问题,详细阐述了代码实现过程,重点在于自加/减操作的正确使用,以及解题思路的记录。
摘要由CSDN通过智能技术生成

一、题目描述

二、代码

import java.util.Scanner;
public class Main {
	static int m, n;
	static int[][] map;
	static int[][] book;
	static int mid;
	//顺时针顺序
	static int[][] order = {
			{0, 1},
			{1, 0},
			{0, -1},
			{-1, 0}
	};
	static int res;
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		
		m = in.nextInt();
		n = in.nextInt();
		map = new int[n][m];
		book = new int[n][m];
		res = Integer.MAX_VALUE;
		//计算所有数的和
		int count = 0;
		
		for(int i = 0; i < n; i++){
			for(int j = 0; j < m; j++){
				map[i][j] = in.nextInt();
				count += map[i][j];
			}
		}
		
		in.close();
		
		//计算各个部分的和
		mid = count / 2;
		
		book[0][0] = 1;
		dfs(0, 0, map[0][0], 1);
		if(res == Integer.MAX_VALUE)
			System.out.println(0);
		else
			System.out.println(res);
	}
	
	private static void dfs(int x, int y, int num, int res_tmp) {
		if(num > mid){
			return;
		}
		if(num == mid){
			
			res = Math.min(res, res_tmp);
			
			return;
		}
		
		
		for(int i = 0; i < 4; i++){
			
			int x_tmp = x + order[i][0];
			int y_tmp = y + order[i][1];
			
			if(x_tmp >= 0 && x_tmp < n && y_tmp < m && y_tmp >= 0 && book[x_tmp][y_tmp] == 0){
				
				book[x_tmp][y_tmp] = 1;
				
				res_tmp += 1;
				dfs(x_tmp, y_tmp, num + map[x_tmp][y_tmp], res_tmp);
				
				res_tmp--;
				book[x_tmp][y_tmp] = 0;
				
				
			}
			
		}
		
	}
	
}

三、思路记录

  1. 使用 dfs
  2. 注意 自加/减 的使用方法(传入值时,使用a++形式,传过的仍为a)

四、结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值