题目:有n行n列的小黑点,还有m条线段连接其中的一些小黑点。统计这些线段连成了多少个正方形(每种边长分别统计)。
这道题关于H V下标书上的叙述有点小问题,具体见下
(来源官网)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #define max 10 //数组里的0 0都不用 bool H[max][max]; bool V[max][max]; int n,m,num[max]; bool besqr(int i,int j,int size){ //判断以i行j列为左上端点的size大小的正方形是否成立 for(int k=0;k<size;k++) if(!H[i][j++]) return 0; for(int k=0;k<size;k++) if(!V[j][i++]) return 0; j--; for(int k=0;k<size;k++) if(!H[i][j--]) return 0; j++; i--; for(int k=0;k<size;k++) if(!V[j][i--]) return 0; return 1; } void cal(int x){ //计算个数 if(x==n) return; for(int i=1;i<=n-x;i++) for(int j=1;j<=n-x;j++) if(besqr(i,j,x)) num[x]++; cal(x+1); } int main(){ int times=1; while(scanf("%d%d",&n,&m)==2){ memset(H,0,sizeof(H)); memset(V,0,sizeof(V)); memset(num,0,sizeof(num)); for(int i=0;i<m;i++){ getchar(); char type; int a,b; scanf("%c%d%d",&type,&a,&b); if(type=='H') H[a][b]=1; else V[a][b]=1; } cal(1); if(times!=1) printf("\n**********************************\n\n"); printf("Problem #%d\n\n",times++); bool none=1; for(int i=1;i<n;i++) if(num[i]){ printf("%d square (s) of size %d\n",num[i],i); none=0; } if(none) printf("No completed squares can be found.\n"); } return 0; } |