蓋房子1057
阿新 • • 發佈:2019-02-05
描述
永恆の靈魂最近得到了面積為n*m的一大塊土地(高興ING^_^),他想在這塊土地上建造一所房子,這個房子必須是正方形的。
但是,這塊土地並非十全十美,上面有很多不平坦的地方(也可以叫瑕疵)。這些瑕疵十分噁心,以至於根本不能在上面蓋一磚一瓦。
他希望找到一塊最大的正方形無瑕疵土地來蓋房子。
不過,這並不是什麼難題,永恆の靈魂在10分鐘內就輕鬆解決了這個問題。
現在,您也來試試吧。
格式
輸入格式
輸入檔案第一行為兩個整數n,m(1<=n,m<=1000),接下來n行,每行m個數字,用空格隔開。0表示該塊土地有瑕疵,1表示該塊土地完好。
輸出格式
一個整數,最大正方形的邊長。
樣例1
樣例輸入1
4 4
0 1 1 1
1 1 1 0
0 1 1 0
1 1 0 1
樣例輸出1
2
發現一個奇怪的現象:當 i 和 j 的初始值都為0時,Vijos上面有兩組資料會錯誤,但如果 i 和 j 的初始值都為1時,他又AC了,(草民愚鈍,未能解此謎團,請飄過此地的青天大老爺開個口,以解此惑)
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
cin>>t;
if(t)
f[i][j]=min(f[i-1][j-1],min(f[i-1][j],f[i][j-1]))+1;
ans=max(f[i][j],ans);
}
}
#include<bits/stdc++.h>
using namespace std;
int m,n,f[1005][1005],ans,t;
int main()
{
cin>>m>>n;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
cin>>t;
if(t)
f[i][j]=min(f[i-1][j-1],min(f[i-1][j],f[i][j-1]))+1;
ans=max(f[i][j],ans);
}
}
cout<<ans<<endl;
return 0;
}