剪格子—题解

1. 剪格子

    如图p1.jpg所示,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

 

(参见p2.jpg)

 


资源约定:

峰值内存消耗(含虚拟机) < 64M

CPU消耗  < 5000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意:不要使用package语句。不要使用jdk1.6及以上版本的特性。

注意:主类的名字必须是:Main,否则按无效代码处理。


解题思路: 数据规模较小,10*10方格,  DFS解决


源码:

import java.util.Scanner;



/**
 * 
 *  剪格子
 *  
 */

public class Main1
{
	public static int aver = 0;     // 数值
	public static int count = 100;  // 最小分割个数 
	public static void main(String[] args)
	{
		Scanner sc = new Scanner(System.in);
		int m = sc.nextInt();
		int n = sc.nextInt();
		int arr[][] = new int[n][m];
		for (int i = 0; i < n; i++)
			for (int j = 0; j < m; j++)
			{
				arr[i][j] = sc.nextInt();
				aver += arr[i][j];
			}
		aver /= 2;
		sc.close();
		
		boolean record[][] = new boolean[n][m];
		dfs(0, 0, arr, record, 1, arr[0][0]);
		System.out.println(count);
	}
    
	// 搜索
	private static void dfs(int x, int y, int[][] arr, boolean[][] record,int num, int sum)
	{
		if (record[x][y] || sum > aver) return;
		 record[x][y] = true;  //访问记录
		if (sum == aver && num < count)
		{
			count = num; 
			for (int i = 0; i < record.length; i++)
			{
				for (int j = 0; j < record[i].length; j++)
				{
					System.out.print(record[i][j]+"-"+arr[i][j] + " " );
				}
				System.out.println();
			}
			System.out.println("-------------------------------------");
		}
		else
		{
			 if (x+1 < arr.length)
			 dfs(x+1, y, arr, record, num+1, sum+arr[x+1][y]);
			 if (x-1 >= 0)
			 dfs(x-1, y, arr, record, num+1, sum+arr[x-1][y]);
			 if (y+1 < arr[0].length)
			 dfs(x, y+1, arr, record, num+1, sum+arr[x][y+1]);
			 if (y-1 >= 0)
			 dfs(x, y-1, arr, record, num+1, sum+arr[x][y-1]);
		}
		
		record[x][y] = false; // 回溯
	}
}





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值