细节题,判断正方形比较麻烦,还有格式要注意,用时1h30min+
考虑了两组数据结构存储
1.H[][]保存横排线,V[][]保存竖排线,判断正方形要x,y坐标换来换去,再加一加什么的
2.给每个点标号1~n^2 ,输入时处理一下数据用一个d[][]存储就好,判断正方形比前面这种稍微简单一点
我是用前者方法
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
int H[10][10],V[10][10],ans[10],n;
void IsSquare(int x,int y);
int main()
{
int m,kase=0;
while(scanf("%d%d",&n,&m)!=EOF)
{
char ch;
memset(H,0,sizeof(H));
memset(V,0,sizeof(V));
while(m--)
{
int i,j;
scanf("\n%c%d%d",&ch,&i,&j);
if(ch=='H') H[i][j]=1;
else V[i][j]=1;
}
memset(ans,0,sizeof(ans));
for(int i=1;i<n;i++)
for(int j=1;j<n;j++)
IsSquare(i,j);
if(kase) printf("\n**********************************\n\n");
printf("Problem #%d\n\n",++kase);
int ok=1;
for(int i=1;i<=n;i++)
if(ans[i]){
printf("%d square (s) of size %d\n",ans[i],i);
ok=0;
}
if(ok) printf("No completed squares can be found.\n");
}
}
void IsSquare(int x,int y)
{
if(!(H[x][y]&&V[y][x])) return ;
for(int i=1;i+max(x,y)<=n;i++)
{
if(H[x+i][y]&&V[y+i][x])
{
int j=0;
for(j=1;j<i;j++)
if(!(H[x+i][y+j]&&V[y+i][x+j])) break;
if(j==i) ans[i]++;
}
if(!(H[x][y+i]&&V[y][x+i])) break;
}
}