题目:返回一个二维整数数组中最大联通子数组的和。
要求: 输入一个二维整形数组,数组里有正数也有负数。 求所有子数组的和的最大值。
程序要使用的数组放在一个叫 input.txt 的文件中, 文件格式是: 数组的行数, 数组的列数, 每一行的元素, (用逗号分开) 每一个数字都是有符号32位整数,当然,行数和列数都是正整数。
源程序
/*
设计思路:
1、首先从文件读入一个二维整型数组(有正有负);
2、从数组中选出最小的一个数,如果为负数则除去,检验联通性;
3、联通,接下来找剩余中最小的数,如果为负数则除去,检验联通性;如果为正数,则可得最大的和。
4、如果在检验联通性时不成立,则保存最近的联通数组的和。
5、循环执行第3步,直到保存了所有可能的联通数组的和,找出最大值。
*/
package zishuzu1;
import java.io.*;
public class zishuzu1 {
static int b=52345;
static int[][] p= new int[100][100];
public static void main(String[] args) throws IOException {
File f = new File("input.txt");
BufferedReader buf = new BufferedReader(new FileReader(f));
int temp=0,line = 0;
String str;
System.out.println("数组:");
int m=Integer.parseInt(buf.readLine());//行
int n=Integer.parseInt(buf.readLine());//列
while ((str=buf.readLine()) != null)
{
String[] data = str.split(",");
for (int i = 0; i < data.length; i++)
{
p[line][i] = Integer.parseInt(data[i]);
if(temp!=line)
{
temp=line;
System.out.println();
}
System.out.print(p[line][i]+" ");
}
line++;
}
System.out.println();
int []a=new int [100];//保存和
int []aa=new int [100];//保存去掉的使不连通的数
int h=0,t=0,s=a[0],s1=0;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(min(m,n)<0)
{
a[h]=sum(m,n);
aa[t]=qmin(m,n);
h++;
if(liantong(m,n)==true)
continue;
else
{
t++;
continue;
}
}
else
{
System.out.println("最大联通子数组的和:"+sum(m,n));
i=m;
break;
}
}
}
for(int d=0;d<h;d++)
{
if(a[d+1]>=a[d])
s=a[d+1];
}
for(int d=0;d<t-1;d++)
{
System.out.println(aa[d]);
s1=s1+aa[d];
}
int result =s+s1;
System.out.println("最大联通子数组的和:"+result);
}
public static boolean liantong(int m,int n)
{
int k=0;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(i==0&&j==0)
{
if(p[i+1][j]==b&&p[i][j+1]==b)
k=-1;
}
else if(i==m-1&&j==n-1)
{
if(p[i-1][j]==b&&p[i][j-1]==b)
k=-1;
}
else if(i==0&&j==n-1)
{
if(p[i+1][j]==b&&p[i][j-1]==b)
k=-1;
}
else if(i==m-1&&j==0)
{
if(p[i-1][j]==b&&p[i][j+1]==b)
k=-1;
}
else if(i==0&&j!=0)
{
if(p[i+1][j]==b&&p[i][j+1]==b&&p[i][j-1]==b)
k=-1;
}
else if(i!=0&&j==0)
{
if(p[i+1][j]==b&&p[i-1][j]==b&&p[i][j+1]==b)
k=-1;
}
else if(i!=0&&i!=m-1&&j!=0&&j!=n-1)
{
if(p[i+1][j]==b&&p[i-1][j]==b&&p[i][j+1]==b&&p[i][j-1]==b)
k=-1;
}
}
}
if(k==-1) return false;
else return true;
}
public static int min(int m,int n)
{
int minz=p[0][0];
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(p[i][j]!=b&&p[i][j]<minz)
{
minz=p[i][j];
}
}
}
return minz;
}
public static int sum(int m,int n)
{
int sumz=0;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(p[i][j]!=b)
{
sumz=sumz+p[i][j];
}
}
}
return sumz;
}
public static int qmin(int m,int n)
{
int w=0;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(min(m,n)==p[i][j])
{
w=p[i][j];
p[i][j]=b;
i=m;
break;
}
}
}
return w;
}
}
结果截图


然而此程序还有小bug有待改进,还未成功。
结对成员(刘玉,陈孜洋)
编程过程中遇见很多思路的问题,两人相互讨论,得出都认可的解决方法。效率也提高了。
来源:https://www.cnblogs.com/qkmn/p/6684228.html