------文章底部代码分享
一、题目
标题:剪格子
如图所示, 3 x 3的格子中填写了一些整数。
我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是60。
本题的要求就是请你编程判定:对给定的m x n的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等。
如果存在多种解答,请输出包含左上角格子的那个区域包含的格子的最小数目。
如果无法分割,则输出 0 ;
程序输入输出格式要求:
程序先读入两个整数 m n 用空格分割(m,n<10)
表示表格的宽度和高度
接下来是n行,每行m个正整数,用空格分开。每个整数不大于10000
程序输出:在所有解中,包含左上角的分割区可能包含的最小的格子数目。
例如:
用户输入:
3 3
10 1 52
20 30 1
1 2 3
则程序输出:
3
再例如:
用户输入:
4 3
1 1 1 1
1 30 80 2
1 1 1 100
则程序输出:
10
资源约定: 峰值内存消耗(含虚拟机) < 64M CPU消耗 <5000ms 请严格按要求输出,不要画蛇添足地打印类似:“请您输入..”的多余内容。 所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。 注意:不要使用package语句。不要使用jdk1.6及以上版本的特性。 注意:主类的名字必须是:Main,否则按无效代码处理。
二、解题
2.1
准备工作:
1.定义两个确定行列的全局变量;
2.定义一个整型全局的二位数组,一个跟该数组行列相同的布尔型二位数组;
3.定义一个计算总数的变量;
4. main 方法内将他们初始化;
(将变量定义到全局进行不同方法的使用时更加方便)
2.2
定义一个存储格子数量的变量;
编写一个方法,方法内传四个值,分别是行列坐标、格子数量、所选取格子内数的总和;
2.3
利用动态规划将坐标可以移动的方向都进行递归;
counts 每次将使用的格子上的数据累加起来;
布尔型数组进行同位置上的布尔值改变用于让后面算法确定是否使用过当前坐标,方法调用完毕后要记得对布尔值的回溯;
2.4
方法内进行两个返回判断:
第一个返回判断是判断当前调用是否满足两部分区域同等条件,以及当前的格子数量是不是最少情况下的,如果满足这两个条件就将格子数记录并返回;
第二个返回判断是用于判断坐标是否越界、格子内数据总量是否越界以及当前坐标是否已经遍历过,如果是则返回;
2.5
最后进行输出,题目要求是没有满足条件就输出 0 ,故判断如果记录值被改变了就输出新值,未被改变就输出 0 ;
三、代码分享
import java.util.Scanner;
public class Main{
static int m , n , nums ;
static int[][] array ;
static boolean[][] bool;
static int countNum = Integer.MAX_VALUE ;
public static void main( String[] args) {
Scanner sc = new Scanner( System.in );
m = sc.nextInt();
n = sc.nextInt();
array = new int[n][m];
bool = new boolean[n][m];
for( int i = 0 ; i < n ; i++ )
for( int j = 0 ; j < m ; j++ ) {
array[i][j] = sc.nextInt();
nums += array[i][j];
}
int times = 0;
count( 0 , 0 , times ,0 );
if ( countNum != Integer.MAX_VALUE )
System.out.println( countNum );
else System.out.println( 0 );
}
public static void count( int x , int y , int times , int counts) {
if ( counts == nums * 0.5 && countNum > times ){
countNum = times ;
return;
}
if( x == n || x < 0 || y == m || y < 0 || counts > nums * 0.5 || bool[x][y] != false ) {
return;
}
counts += array[x][y];
bool[x][y] = true;
count( x - 1 , y , times + 1 , counts );
count( x + 1 , y , times + 1 , counts );
count( x , y + 1 , times + 1 , counts );
count( x , y - 1 , times + 1 , counts );
bool[x][y] = false;
}
}