描述:给定一个元素为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的
}