Problem p00092 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <algorithm>
#include <iostream>
#include <stdio.h>

int n;

using namespace std;
/*
int main(){
    n=1000;
    box = new int*[n];
    for(int i=0; i<n; i++)box[i] = new int[n];
    while(cin>>n){
        if(n==0)break;


        char c;
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                cin>>c;
                if(c=='.')box[i][j]=0;
                else box[i][j]=1;
            }
        }


        int ans=0;

        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                if(box[i][j]==0){
                    bool flag=true;
                    for(int k=i; k<i+ans+1; k++){
                        if(k==n){
                            flag=false;
                            break;
                        }
                        for(int l=j; l<j+ans+1; l++){
                            if(l==n){
                                flag=false;
                                break;
                            }
                            if(box[k][l]==1){
                                flag=false;
                                break;
                            }
                        }
                        if(!flag)break;
                    }
                    if(flag){
                        ans++;
                        j--;
                    }




                }
            }


        }
        cout<<ans<<endl;

    }
    n=1000;
    for(int i=0; i<n; i++)delete[]  box[i];
    delete[]  box;
}

*/

/*
int main(){
    n=1000;
    box = new int*[n];
    for(int i=0; i<n; i++)box[i] = new int[n];
    while(cin>>n){
        if(n==0)break;


        char c;
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                cin>>c;
                if(c=='.')box[i][j]=0;
                else box[i][j]=1;
            }
        }


        int ans=0;

        for(int i=0; i<n; i++){
            if(ans>(n-i)*(n-i))break;
            for(int j=0; j<n; j++){
                if(ans>(n-j)*(n-j))break;

                if(box[i][j]==0){
                    int temp=1;
                    bool f=true;
                    for(int k=j; k<=j+ans; k++){
                        if(box[i][k]==1){
                            f=false;
                            break;
                        }
                        if(!f)break;
                    }

                    while(1){
                        bool flag=true;
                        for(int k=i; k<=i+temp; k++){
                            if(k==n){
                                flag=false;
                                break;
                            }
                            if(box[k][j+temp]!=0){
                                flag=false;
                                break;
                            }
                        }

                        for(int k=j; k<=j+temp; k++){
                            if(k==n){
                                flag=false;
                                break;
                            }
                            if(box[i+temp][k]!=0){
                                flag=false;
                                break;
                            }

                        }
                        if(flag)temp++;
                        else break;
                    }
                    ans=max(ans, temp);

                }
            }


        }
        cout<<ans<<endl;

    }
    n=1000;
    for(int i=0; i<n; i++)delete[]  box[i];
    delete[]  box;
}
*/

int main() {
  while (cin >> n) {
    if (n == 0)
      break;

    int box[1001][1001] = {0};
    char c;
    for (int i = 0; i < n; i++) {
      int count = 0;
      for (int j = 0; j < n; j++) {
        cin >> c;
        if (c == '.') {
          count++;
          box[i][j] = count;
        } else {
          count = 0;
          box[i][j] = 0;
        }
      }
    }

    int ans = 0;

    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) {
        int temp = box[i][j];
        if (temp > ans) {

          for (int k = i; k < i + box[i][j]; k++) {
            if (temp <= k - i)
              break;
            temp = min(temp, box[k][j]);
          }

          ans = max(temp, ans);
        }
      }
    }
    cout << ans << endl;
  }
}

Fixed submission:
#include <algorithm>
#include <iostream>
#include <stdio.h>

int n;

using namespace std;
/*
int main(){
    n=1000;
    box = new int*[n];
    for(int i=0; i<n; i++)box[i] = new int[n];
    while(cin>>n){
        if(n==0)break;


        char c;
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                cin>>c;
                if(c=='.')box[i][j]=0;
                else box[i][j]=1;
            }
        }


        int ans=0;

        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                if(box[i][j]==0){
                    bool flag=true;
                    for(int k=i; k<i+ans+1; k++){
                        if(k==n){
                            flag=false;
                            break;
                        }
                        for(int l=j; l<j+ans+1; l++){
                            if(l==n){
                                flag=false;
                                break;
                            }
                            if(box[k][l]==1){
                                flag=false;
                                break;
                            }
                        }
                        if(!flag)break;
                    }
                    if(flag){
                        ans++;
                        j--;
                    }




                }
            }


        }
        cout<<ans<<endl;

    }
    n=1000;
    for(int i=0; i<n; i++)delete[]  box[i];
    delete[]  box;
}

*/

/*
int main(){
    n=1000;
    box = new int*[n];
    for(int i=0; i<n; i++)box[i] = new int[n];
    while(cin>>n){
        if(n==0)break;


        char c;
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                cin>>c;
                if(c=='.')box[i][j]=0;
                else box[i][j]=1;
            }
        }


        int ans=0;

        for(int i=0; i<n; i++){
            if(ans>(n-i)*(n-i))break;
            for(int j=0; j<n; j++){
                if(ans>(n-j)*(n-j))break;

                if(box[i][j]==0){
                    int temp=1;
                    bool f=true;
                    for(int k=j; k<=j+ans; k++){
                        if(box[i][k]==1){
                            f=false;
                            break;
                        }
                        if(!f)break;
                    }

                    while(1){
                        bool flag=true;
                        for(int k=i; k<=i+temp; k++){
                            if(k==n){
                                flag=false;
                                break;
                            }
                            if(box[k][j+temp]!=0){
                                flag=false;
                                break;
                            }
                        }

                        for(int k=j; k<=j+temp; k++){
                            if(k==n){
                                flag=false;
                                break;
                            }
                            if(box[i+temp][k]!=0){
                                flag=false;
                                break;
                            }

                        }
                        if(flag)temp++;
                        else break;
                    }
                    ans=max(ans, temp);

                }
            }


        }
        cout<<ans<<endl;

    }
    n=1000;
    for(int i=0; i<n; i++)delete[]  box[i];
    delete[]  box;
}
*/

int main() {
  while (cin >> n) {
    if (n == 0)
      break;

    int box[1001][1001] = {0};
    char c;
    for (int i = 0; i < n; i++) {
      int count = 0;
      for (int j = 0; j < n; j++) {
        cin >> c;
        if (c == '.') {
          count++;
          box[i][j] = count;
        } else {
          count = 0;
          box[i][j] = 0;
        }
      }
    }

    int ans = 0;

    for (int i = 0; i < n; i++) {
      for (int j = n - 1; j >= 0; j--) {
        int temp = box[i][j];
        if (temp > ans) {

          for (int k = i; k < i + box[i][j]; k++) {
            if (temp <= k - i)
              break;
            temp = min(temp, box[k][j]);
          }

          ans = max(temp, ans);
        }
      }
    }
    cout << ans << endl;
  }
}