#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int board[19][19];
int main()
{
int n;
int times=0;
while(scanf("%d",&n)!=EOF){
times++;
int amount;
cin>>amount;
memset(board,0,sizeof(board));
for(int i=0;i<amount;i++){
char direc;
int x,y;
cin>>direc>>x>>y;
x--;
y--;
if(direc=='H'){
board[2*x][2*y+1]=1;
}else{
board[2*y+1][2*x]=1;
}
}//输入完全正确
int res[9];
memset(res,0,sizeof(res));
//下标+1为正方形边长//存储正方形数量,初始为0;
for(int i=0;i<2*n-3;i+=2){
for(int j=0;j<2*n-3;j++){
for(int tn=1;tn<n;tn++){
int flag=1;
for(int t=0;t<tn;t++){
flag*=board[i+1+2*t][j];
flag*=board[i][j+1+2*t];
flag*=board[i+2*tn][j+1+2*t];
flag*=board[i+1+2*t][j+2*tn];
if(flag==0){
break;
}
}
if(flag){
res[tn-1]++;
}
}
}
}
if(times!=1){
printf("\n**********************************\n\n");
}
printf("Problem #%d\n\n",times);
int fr=1;
for(int i=0;i<n;i++){
if(res[i]!=0){
fr=0;
printf("%d square (s) of size %d\n",res[i],i+1);
}
}
if(fr){
printf("No completed squares can be found.\n");
}
}
return 0;
}
这道题还算简单,模拟边直接解决。
先选择一个顶点,再看这个顶点能否作为边长为1,2,……正方形的左上顶点,发现符合的记录即可
有一点诡异的是,最多只有9个顶点,数组按理说定义为17*17即可,但是这样一定会WA,要定义更大的数组才行。鄙人不才,不解,但为保险起见,以后要定义更充裕的空间才是上策。