这个题数据小,所以我们暴力可解,思路是这样的: heng[ i ] [ j ] 一旦是 1 , 就意味着,在( i,j )这个点出发有个 向右的线。 zhi[][] 同理,向下的线。然后枚举所有边的情况,一旦judge 函数在某个点,找到了某个 以 len 为边的 完整的方形(len,x,y),就返回1
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int zhi[11][11],heng[11][11]; 5 int len[11]; 6 int judge(int len,int x,int y){ 7 for(int i=0;i<len;i++){ //边是由线段构成的,一旦有哪个段不成立,立即退出。 8 if(zhi[x][y+i]==0) //从左上角 一直到 左下角 9 return -1; 10 if(heng[x+i][y]==0) //从左上角 一直到 右上角 11 return -1; 12 if(zhi[x+len][y+i]==0) //从 右上角 一直到右下角 13 return -1; 14 if(heng[x+i][y+len]==0) //从左下角 一直到 右下角 15 return -1; 16 } 17 return 1; //都走完了,成立 18 } 19 20 int main(){ 21 int n,m,k; 22 int t1,t2; 23 char c,cc,ccc,cccc; 24 int con=0; 25 while(++con && cin>>n>>m){ 26 memset(zhi,0,sizeof(zhi)); 27 memset(heng,0,sizeof(heng)); 28 memset(len,0,sizeof(len)); 29 30 for(int i=0;i<m;i++){ 31 scanf("%c%c%c%d%c%d",&cccc,&c,&cc,&t1,&ccc,&t2); 32 33 if(c==‘H‘) {/*cout<<"sss"<<endl; */ zhi[t1][t2]=1; } 34 if(c==‘V‘) heng[t2][t1]=1; //注意,我说的紫书错的地方就在这里,你如果按刘老师写的,那是 heng[t1][t2]=1,我一直卡这里,后来改成符合原题的,ac 35 } 36 37 if(con!=1) printf("\n**********************************\n\n"); 38 for(int i=1;i<=n;i++){ 39 for(int x=1;x<=n-i+1;x++){ //压缩 40 for(int y=1;y<=n-i+1;y++){ //压缩 41 42 if(judge(i,x,y) == 1) 43 { 44 //cout<<"ok"<<endl; 45 len[i]++; 46 } 47 48 } 49 } 50 } 51 52 int flag=0; 53 54 printf("Problem #%d\n\n",con); 55 for(int i=1;i<=n;i++) 56 if(len[i]!=0){ 57 flag++; 58 printf("%d square (s) of size %d\n",len[i],i); 59 } 60 if(flag==0) 61 printf("No completed squares can be found.\n"); 62 } 63 }
原文地址:https://www.cnblogs.com/3532gll/p/9416446.html
时间: 2024-11-08 09:59:15