这道题要求找到所有尺寸正方形的个数,我的思路是从一开始找,一直到最大的正方形
根据函数式编程的思路,编写一个函数,传入尺寸,找到相应的正方形个数,主函数只需遍历不同尺寸就行了
对于找到满足正方形的要求,我找到了一个规律,虽然很复杂,但是实现并不困难
我先找到满足要求的第一条横向边,对应的那条纵向边和横向边的下标是一样的,紧接着找横向边平行的下面的那条横向边,纵向也这样找,即下标+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; }