java方阵中寻找最大子方阵

  描述:给定一个元素为0和1的方阵,找到元素全为1的最大子方阵,提示用户输入方阵函数,输出这个子方阵的第一个元素的下标和子方阵的长。

  示例: 

 采用的是递归解决,返回的是一个一维数组里面包含有三个元素,坐标和长

考虑递归来源于一个方阵可以拆成4个边长少1的方阵,对方阵进行遍历,如果发现方阵依然有0,直接进入下一次递归再拆成4个边长少1的方阵,如果没达到边界之前发现这个方阵全是1,直接返回这个方阵的坐标和长,边长等于2时到达边界,再遍历一次如果全为1那就返回边长为2,不全为1返回边长为0表示这个方阵查找失败。在返回的4个方阵中选择边长最长的方阵进行返回,以此类推直到返回一个最终的数组。

//代码如下,函数名可自己定义,自行修改函数名即可

public static int[] findLargestBlockForTopic_3_35(int[][]m,int row,int col,int n) {
	  //row和col表示的是方阵的左上角的坐标,n表示方阵的长度
	  if(n==2) {//先判断到没到边界,到达边界之后,如果仍然有0直接返回为0表示查找无效
		  for(int i=row;i<n+row;i++) {
			  for(int k=col;k<n+col;k++) {
				  if(m[i][k]==0) {
					  int[]End={row,col,0};//这个返回为0表示知道递归到最小方块也没有进行
					  return End;
				  }
			  }
		  }
	  }
	  else {//如果没到边界但是还是递归下来了,进行遍历,如果查到0直接进行下一步递归,如果没查到0直接返回不需要继续递归
		  for(int i=row;i<n+row;i++) {
			  for(int k=col;k<n+col;k++) {
				  if(m[i][k]==0) {
					  int[] m1=findLargestBlockForTopic_3_35(m,row+1,col,n-1);
					  int[] m2=findLargestBlockForTopic_3_35(m,row,col+1,n-1);
					  int[] m3=findLargestBlockForTopic_3_35(m,row,col,n-1);
					  int[] m4=findLargestBlockForTopic_3_35(m,row+1,col+1,n-1);
					  
					  //寻找最长长度,并获取下标是m1 m2 m3 m4
					  int max=m1[2];
					  int flag=1;
					  if(m2[2]>max) {
						  max=m2[2];
						  flag=2;
					  }
					  if(m3[2]>max) {
						  max=m3[2];
						  flag=3;
					  }
					  if(m4[2]>max) {
						  max=m4[2];
						  flag=4;
					  }
					  
					  //返回
					  switch(flag) {
					  case 1:return m1;
					  case 2:return m2;
					  case 3:return m3;
					  case 4:return m4;
					  }
				  }
			  }
		  }
	  }
	  int[] End= {row,col,n};
	  return End;//注意边界返回的时候有类似一种树的感觉我们要求返回最大值,使用三目运算符或者java的
  }

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值