这道题要求找到所有尺寸正方形的个数,我的思路是从一开始找,一直到最大的正方形

根据函数式编程的思路,编写一个函数,传入尺寸,找到相应的正方形个数,主函数只需遍历不同尺寸就行了

对于找到满足正方形的要求,我找到了一个规律,虽然很复杂,但是实现并不困难

我先找到满足要求的第一条横向边,对应的那条纵向边和横向边的下标是一样的,紧接着找横向边平行的下面的那条横向边,纵向也这样找,即下标+size;

然后逐一判断横向的每一条边,纵向亦然,就可以判断出来了

#include<iostream>
#include<string.h>
#define maxn 30
using std::cin;
int h[maxn][maxn], v[maxn][maxn], size[maxn];
int jsize(int size, int n)
{
    int re=0;
    for(int i=1; i<=n; i++){
        for(int j=1; j<=n; j++){
            int cnt=0;
            for(int k=0; k<size; k++){
                if(h[i][j+k]==1) cnt++;
                if(h[i+size][j+k]==1) cnt++;
                if(v[j][i+k]==1) cnt++;
                if(v[j+size][i+k]==1) cnt++;
            }
            if(cnt==size*4) re++;
        }
    }
    return re;
}
int main()
{
    int n, x, y, k, cnt=1;
    char c;
    while(scanf("%d", &n)!=EOF){
        int temp=0;
        for(int i=0; i<maxn; i++) { memset(h[i], 0, sizeof(h[i])); memset(v[i], 0, sizeof(v[i])); memset(size, 0, sizeof(size)); }
        scanf("%d", &k);
        for(int i=0; i<k; i++){
            cin >> c >> x >> y;
            if(c=='H') h[x][y]=1;
            else v[x][y]=1;
        }
        if(cnt!=1) printf("\n**********************************\n\n");
        for(int i=1; i<10; i++) size[i]=jsize(i, n);
        printf("Problem #%d\n\n", cnt); cnt++;
        for(int i=1; i<10; i++) if(size[i]!=0){
            if(size[i]!=0){
                printf("%d square (s) of size %d\n", size[i], i);
                temp++;
            }
        }
        if(temp==0) printf("No completed squares can be found.\n");
    }
    return 0;
}