蓝桥杯_PREV_4剪格子

题目:

历届试题 剪格子

时间限制:1.0s   内存限制:256.0MB

问题描述

如下图所示,3 x 3 的格子中填写了一些整数。

+--*--+--+

|10* 1|52|

+--****--+

|20|30* 1|

*******--+

| 1| 2| 3|

+--+--+--+

我们沿着图中的星号线剪开,得到两个部分,每个部分的数字和都是60。

本题的要求就是请你编程判定:对给定的m x n 的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等。

如果存在多种解答,请输出包含左上角格子的那个区域包含的格子的最小数目。

如果无法分割,则输出 0。

输入格式

程序先读入两个整数 m n 用空格分割 (m,n<10)。

表示表格的宽度和高度。

接下来是n行,每行m个正整数,用空格分开。每个整数不大于10000。

输出格式

输出一个整数,表示在所有解中,包含左上角的分割区可能包含的最小的格子数目。

样例输入1

3 3

10 1 52

20 30 1

1 2 3

样例输出1

3

样例输入2

4 3

1 1 1 1

1 30 80 2

1 1 1 100

样例输出2

10

解题思路:

首先求出所有节点和的一半sum,从左上角那个点一次向后进行回溯+剪枝搜索,如遇到所经过结点和等于sum,则将深度deep加入优先级队列(使用优先级队列可以在最后直接peek得出最小深度)。

回溯采用dfs的方法,剪枝条件有

(1)所经过结点和大于sum

(2)所经过结点和等于sum

(3)结点x,y坐标超出矩阵边界

(4)当前结点之前已经到达过,即b[x][y] == true

代码如下:

import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner;

public class Main {

	// 总和的一半
	static int num;
	// 行数
	static int hang;
	// 列数
	static int lie;
	// 存放数据
	static int[][] mix;
	// 记录某个结点是否在当前路径下已经被访问,false表示未访问,true表示已访问
	static boolean[][] b;
	// 当前路径所经过结点和
	static int sum = 0;
	// 优先队列
	static Queue<Integer> queue = new PriorityQueue<Integer>();

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);

		lie = sc.nextInt();
		hang = sc.nextInt();
		mix = new int[hang][lie];
		b = new boolean[hang][lie];
		int temp = 0;
		for (int a = 0; a < hang; a++) {
			for (int b = 0; b < lie; b++) {
				mix[a][b] = sc.nextInt();
				temp += mix[a][b];
			}
		}
		num = temp >> 1;
		sc.close();

		dfs(0, 0, 1);

		System.out.println(queue.peek() == null ? 0 : queue.peek());
	}

	/**
	 * 回溯矩阵所有结点
	 * @param x
	 * @param y
	 * @param deep
	 */
	private static void dfs(int x, int y, int deep) {

		if (x < 0 || x >= hang || y < 0 || y >= lie || b[x][y]) {
			return;
		}
		if ((sum + mix[x][y]) > num) {
			return;
		}
		if ((sum + mix[x][y]) == num) {
			queue.add(deep);
			return;
		}

		sum += mix[x][y];
		b[x][y] = true;

		dfs(x - 1, y, deep + 1);
		dfs(x, y - 1, deep + 1);
		dfs(x + 1, y, deep + 1);
		dfs(x, y + 1, deep + 1);

		sum -= mix[x][y];
		b[x][y] = false;
	}

}
时间: 2025-01-04 08:26:43

蓝桥杯_PREV_4剪格子的相关文章

蓝桥杯程序设计 剪格子

我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是60. 本题的要求就是请你编程判定:对给定的m x n 的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等.如果存在多种解答,请输出包含左上角格子的那个区域包含的格子的最小数目.如果无法分割,则输出 0 程序输入输出格式要求: 程序先读入两个整数 m n 用空格分割 (m,n<10)表示表格的宽度和高度接下来是n行,每行m个正整数,用空格分开.每个整数不大于10000程序输出:在所有解中,包含左上角的分割区可能包含的最小

2015 蓝桥杯:4.格子中输出

*/--> pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;}

【蓝桥杯】操作格子

问题描述 有n个格子,从左到右放成一排,编号为1-n. 共有m次操作,有3种操作类型: 1.修改一个格子的权值, 2.求连续一段格子权值和, 3.求连续一段格子的最大值. 对于每个2.3操作输出你所求出的结果. 输入格式 第一行2个整数n,m. 接下来一行n个整数表示n个格子的初始权值. 接下来m行,每行3个整数p,x,y,p表示操作类型,p=1时表示修改格子x的权值为y,p=2时表示求区间[x,y]内格子权值和,p=3时表示求区间[x,y]内格子最大的权值. 输出格式 有若干行,行数等于p=2

蓝桥杯《操作格子》

解题过程:题意通俗易懂,看完题目以为是普通的对数组进行操作的题目,但是看到输入的数据范围后,发现并不是.但是因为没有好的想法,只能用最简单的方式做,毫无意外的超时了.然后找到这篇博文:http://blog.csdn.net/qq_33245342/article/details/54892576 问题描述  有n个格子,从左到右放成一排,编号为1-n. 共有m次操作,有3种操作类型: 1.修改一个格子的权值, 2.求连续一段格子权值和, 3.求连续一段格子的最大值. 对于每个2.3操作输出你所

蓝桥杯 剪格子

就是从0,0开始走一个凸多边形出来,找出走出一半的最小步数-- #include<iostream> #include<map> #include<string> #include<cstring> #include<cstdio> #include<cstdlib> #include<cmath> #include<queue> #include<vector> #include<algor

【蓝桥杯】历届试题 剪格子(未完成)

  历届试题 剪格子   时间限制:1.0s   内存限制:256.0MB 问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+|10* 1|52|+--****--+|20|30* 1|*******--+| 1| 2| 3|+--+--+--+ 我们沿着图中的星号线剪开,得到两个部分,每个部分的数字和都是60. 本题的要求就是请你编程判定:对给定的m x n 的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等. 如果存在多种解答,请输出包含左上角格

蓝桥杯 历届试题 剪格子 简单的DFS~~注意输入有陷阱~~

历届试题 剪格子 时间限制:1.0s   内存限制:256.0MB 问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+ |10* 1|52| +--****--+ |20|30* 1| *******--+ | 1| 2| 3| +--+--+--+ 我们沿着图中的星号线剪开,得到两个部分,每个部分的数字和都是60. 本题的要求就是请你编程判定:对给定的m x n 的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等. 如果存在多种解答,请输出包含左上

【蓝桥杯】 PREV-4 剪格子

题目链接:http://lx.lanqiao.org/problem.page?gpid=T27 历届试题 剪格子 时间限制:1.0s   内存限制:256.0MB 问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+ |10* 1|52| +--****--+ |20|30* 1| *******--+ | 1| 2| 3| +--+--+--+ 我们沿着图中的星号线剪开,得到两个部分,每个部分的数字和都是60. 本题的要求就是请你编程判定:对给定的m x n 的格

蓝桥杯 - 剪格子 (简单DFS)

历届试题 剪格子 时间限制:1.0s   内存限制:256.0MB 问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+ |10* 1|52| +--****--+ |20|30* 1| *******--+ | 1| 2| 3| +--+--+--+ 我们沿着图中的星号线剪开,得到两个部分,每个部分的数字和都是60. 本题的要求就是请你编程判定:对给定的m x n 的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等. 如果存在多种解答,请输出包含左上