Nguồn đề bài: QBSQUARE
1. Đề bài QBSQUARE spoj
Cho một bảng kích thước MxN, được chia thành lưới ô vuông đơn vị M dòng N cột ( 1 <= M, N <= 1000 )
Trên các ô của bảng ghi số 0 hoặc 1. Các dòng của bảng được đánh số 1, 2… M theo thứ tự từ trên xuống dưới và các cột của bảng được đánh số 1, 2…, N theo thứ tự từ trái qua phải
Yêu cầu:
Hãy tìm một hình vuông gồm các ô của bảng thoả mãn các điều kiện sau:
1 – Hình vuông là đồng nhất: tức là các ô thuộc hình vuông đó phải ghi các số giống nhau (0 hoặc 1)
2 – Cạnh hình vuông song song với cạnh bảng.
3 – Kích thước hình vuông là lớn nhất có thể
Input
Dòng 1: Ghi hai số m, n
M dòng tiếp theo, dòng thứ i ghi N số mà số thứ j là số ghi trên ô (i, j) của bảng
Output
Gồm 1 dòng duy nhất ghi kích thước cạnh của hình vuông tìm được
Example
Input:
11 13
0 0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 1 1 1 0 0 0 0 0 0
0 0 1 1 1 1 1 1 1 0 0 0 0
0 0 1 1 1 1 1 1 1 0 0 0 0
0 1 1 1 1 1 1 1 1 1 0 0 0
1 1 1 1 1 1 1 1 1 1 1 0 0
0 1 1 1 1 1 1 1 1 1 0 0 0
0 0 1 1 1 1 1 1 1 0 0 0 0
0 0 1 1 1 1 1 1 1 0 0 0 0
0 0 0 0 1 1 1 0 0 0 0 1 1
0 0 0 0 0 1 0 0 0 0 0 1 1
Output:
7
2. Code tham khảo QBSQUARE spoj
a. Code c++
#include<iostream> #include<algorithm> using namespace std; const int maxn=1005; int n,m,a[maxn][maxn],f[maxn][maxn]; void Init() { scanf("%d%d",&m,&n); for (int i=1;i<=m;i++) for (int j=1;j<=n;j++) { scanf("%d",&a[i][j]); f[i][j]=1; } } int min(int a, int b, int c) { a=min(a,b); return min(a,c); } void Solve() { int res=0; for(int i=2;i<=m;i++) for (int j=2;j<=n;j++) { if(a[i][j]==a[i-1][j-1] && a[i][j]==a[i-1][j] && a[i][j]==a[i][j-1]) f[i][j]=min(f[i-1][j-1], f[i-1][j], f[i][j-1])+1; if(f[i][j]>res) res=f[i][j]; } cout<<res; } int main() { Init(); Solve(); }
b. Code pascal
const fi=''; nmax=1000; type data=longint; var f:text; A:Array[0..nmax+1,0..nmax+1] of byte; S,L,R,D:array[0..nmax*nmax+1] of data; n,m,sta,res:data; procedure docfile; var i,j:data; begin assign(f,fi); reset(f); readln(f,m,n); for i:=1 to m do for j:=1 to n do read(f,a[i,j]); close(f); end; procedure them(x:data); begin inc(sta); s[sta]:=x; end; procedure layra; begin dec(sta); end; function xem:data; begin exit(S[sta]); end; function min(a,b:data):data; begin if a>b then exit(b); exit(a); end; function max(a,b:data):data; begin if a>b then exit(a); exit(b); end; procedure xuli(k:data); var kq,dientich,i,j:data; begin for i:=1 to n do d[i]:=0; for i:=1 to m do begin for j:=1 to n do if a[i,j]<>k then d[j]:=i; sta:=0; for j:=1 to n do begin while (sta>0) and (D[xem]<=d[j]) do layra; if sta=0 then L[j]:=0 else L[j]:=xem; them(j); end; sta:=0; for j:= n downto 1 do begin while (sta>0) and (d[xem]<=d[j]) do layra; if sta=0 then R[j]:=n+1 else R[j]:=xem; them(j); end; for j:=1 to n do res:=max(res,min((i-d[j]),(R[j]-L[j]-1))); end; end; begin docfile; res:=0; xuli(1); xuli(0); writeln(res); end.