Sqaures, ACM/ICPC World Finals 1990, UVa

来源:互联网 发布:淘宝经常退款会怎么样 编辑:程序博客网 时间:2024/04/26 11:43

题目:有n行n列的小黑点,还有m条线段连接其中的一些小黑点。统计这些线段连成了多少个正方形(每种边长分别统计)。


这道题关于H V下标书上的叙述有点小问题,具体见下

(来源官网)


 1 2 3 4 5 6 7 8 910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
#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;}

原创粉丝点击