简单模拟题,在处理坐标上需要更加谨慎防止出错。
#include <cstdio>
#include <cstring>
#include <iostream>
#define maxn 15
using namespace std;
int H[maxn][maxn];
int V[maxn][maxn];
int n,m;
bool issquare(int a,int b,int k){
bool flag = true;
for(int i=a;i<a+k;i++){
if(V[i][b] == 0 || V[i][b+k]==0) flag = false;
//if(H[i][b] == 0 ) flag = false;
}
for(int j=b;j<b+k;j++){
if(H[a][j] == 0 || H[a+k][j]==0) flag = false;
//if(V[a][j] == 0 ) flag = false;
}
return flag;
}
int main(){
int i,j,k,cnt,T=0,tmp;
while(scanf("%d%d",&n,&m)==2 && n){
//cout<<n<<" "<<m<<endl;
cnt = 0;
memset(H,0,sizeof(H));
memset(V,0,sizeof(V));
while(m--){
//cout<<"Label:"<<m<<endl;
int x,y;
char ch;
//char ch = getchar();
//scanf("%d%d",&x,&y);
cin>>ch>>x>>y;
if(ch == 'H') H[x][y] = 1;
else V[y][x] = 1;
}
if (T ++) printf("\n**********************************\n\n");
printf("Problem #%d\n\n",T);
for(k=1;k<=n-1;k++){
tmp = 0;
for(i=1;i<=n;i++){
//if(i+k <= n && issqure(i,k))
for(j=1;j<=n;j++){
if(i+k<=n && j+k<=n && issquare(i,j,k) ){
cnt++;
tmp++;
//cout<<i<<" "<<j<<" "<<k<<endl;
}
}
}
if(tmp) printf("%d square (s) of size %d\n",tmp,k);
}
if (!cnt) printf("No completed squares can be found.\n");
}
return 0;
}