/*
Problem description
在平面N*N(N<=500)的格子上有一些障碍物。要求找到一个最大的正方形,它的内部不包含障碍物。
Input
第一行个正整数,以空格隔开,第一个数n(n<=500)表示格子的大小N,第二个数表示在n*n里障碍物的个数。下面的n行分别描述每个障碍物位置,每一行两个数i,j,(1<=i,j<=500)以空格隔开,分别表示障碍物位于第i行,第j列。
Output
输出最大正方形的边长。
Sample Input
5 4
1 2
3 4
5 2
4 5
Sample Output
3
*/
import java.util.Scanner;
import java.util.ArrayList;
public class ZhengFangXing
{
public static void main(String[] args)
{
int max=0;
int n=0;
int num=0;
int m=0;
int qq=0;
ArrayList<Integer> ar=new ArrayList<Integer>();
Scanner scanner=new Scanner(System.in);
System.out.println("请输入最大格子数及障碍物数目:");
n=scanner.nextInt();
m=scanner.nextInt();
qq=m;
//对N+1个格子进行初始化;
int[][]a=new int[n+1][];
for(int i=0;i<=n;i++)
a[i]=new int[n+1];
System.out.println("请输入障碍物位置:");
//将有障碍物的格子定为1;
while(m!=0)
{
a[scanner.nextInt()][scanner.nextInt()]=1;
m--;
}
/*
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
System.out.print(a[i][j]+"/t");
System.out.println();
}
*/
/*
以下代码用于记录空格的位置,以及长度的
*/
if(qq!=0)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i][j]!=1)
{
num++;
if(j==n)
{
ar.add(num);
ar.add(i);
ar.add(j-num+1);
num=0;
}
}
else
{
if(num!=0)
{
ar.add(num);
ar.add(i);
ar.add(j-num);
num=0;
}
}
}
}
//System.out.println(ar);
while(!ar.isEmpty())
{
//System.out.println("ar.size()="+ar.size()+"/t"+ar);
//System.out.println("max="+max);
if(ar.get(0)==1)
{ //判断后,将其从ArrayList中去掉。
ar.remove(0);
ar.remove(0);
ar.remove(0);
if(1>max) max=1;
}
else if(max>ar.get(0))
{
ar.remove(0);
ar.remove(0);
ar.remove(0);
}
else
{
boolean flag=false;
int sart=0;
//System.out.println("ar.get(1)="+ar.get(1)+"/t"+"ar.get(0)="+ar.get(0));
if((ar.get(1)+ar.get(0)-1)>n) //如果纵坐标+空格长度>格子总长,则以最短的为准。
{
//System.out.println("111");
sart=n-ar.get(1)+1;
}
else
{
//System.out.println("222");
sart=ar.get(0);
}
// System.out.println(sart);
int e=ar.get(1)+sart-1; //取得开始的坐标
int f=ar.get(2)+sart-1;
while(!(ar.get(1)==e&&ar.get(2)==f))
{ if(max>sart) break; //如果开始的长度就小于MAX的话,则不用判断了。一定小于MAX
for(int i=e;i>ar.get(1);i--)
{
for(int j=f;j>ar.get(2);j--)
{
// System.out.println("i="+i+"/t"+"j="+j);
if(a[i][j]==1)
{
sart--;
flag=true;
break;
}
}
if(flag) //看内部是否有障碍物,有则跳出来,进行下一次的循环。
{
flag=false;
break;
}
}
e--;
f--;
}
// System.out.println("sart="+sart);
if(sart>max) max=sart;
ar.remove(0);
ar.remove(0);
ar.remove(0);
}
}
}
else max=n;
System.out.println("max="+max);
}
}
不知道是不是正确的。反正我测几组数据没出问题!
该博客介绍了一个算法问题,即在N*N的网格中找到最大的不含障碍物的正方形。程序通过输入障碍物数量和位置,计算并输出最大正方形的边长。示例输入和输出展示了算法的运行情况。

1840

被折叠的 条评论
为什么被折叠?



