因接触该类题型很少 故没有想出相应的解决办法 故借鉴了网上他人的方法 在看了他人程序后 自己又打了一遍 并加上了一些注释 希望对一些只会C的同学有些帮助。

#include<stdio.h>
#include"common.h"//自己写的一个头文件 本题中Min函数是其中之一
#include<string.h>

int H[10][10],V[10][10];
int n,m;
int size_[10];

void zheng(int x,int y)
{
int a1,a2,a;
a1=n-x;//可以往右最长的边 
a2=n-y;//往下最长的边 
a=min(a1,a2); //可能组成最大的正方形 
int i,j;
for(i=0;i<a;i++)//i+1表示所有可能的边长 

if(H[x+i][y]&&V[x][y+i]) 
{
for(j=0;j<=i;j++)
{
if(!H[x+1+i][y+j]||!V[x+j][y+1+i]) /*其中1+i表示边长 x为起始的点则[x+1+i][y] 表示该正方形
左下角那个点[x+1+i][y+j]即从左下角那个点一直循环到最右边 同理可得 [x+j][y+1+i] 表示从
右上角那个点一直循环到右下角 这样和前面的形成了封闭正方形 
*/
break;
if(i==j)// 
size_[i+1]++;
}
}
else break;



}
void biaoji()
{
memset(H,0,sizeof(H));
memset(V,0,sizeof(V));
for(int i=0;i<m;)
{
int c;
c=getchar();
while(c=='H'||c=='V')
{
i++;
if(c=='H')

H[getchar()-'0'][getchar()-'0']++; 
}
if(c=='V')
{
V[getchar()-'0'][getchar()-'0']++;
}
c=getchar();
}
}
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
printf(".");
}
}
}

void huaxian()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(H[i][j]&&V[i][j])
zheng(i,j);
}
}
}

int main(void)
{
scanf("%d%d",&n,&m);
biaoji();
huaxian();
for(int i=1;i<=10;i++)
{
printf("边长为%d的正方形有%d个\n",i,size_[i]);
}
return 0;
}

 

 

另:本人自己的思路是定义一个三维数组a[10][10][4] 前面代表点的行和列 第三维代表该点上下左右方向是否有线 其元素数值判断有无 1代表有 0代表无

那么就可以根据读取H V的数据来进行相关的赋值 如H12 就可以赋a[1][2][3]=1 a[1][3][2]=1 以此类推 而判断的方法与此题相同(这里是难点 我就是这里想不出来)

即本题zheng函数的思路。