#include<iostream>
#include<string.h>
#define MAX 36
using namespace std;
char temp,board[MAX][MAX];
bool square(int y,int x,int k) { //判断是否存在四条线
for(int i=(2*x-1); i<=(2*(x+k)-1) ; i++) {
if(board[2*y-1][i] != '*') {
return false;
}
}
for(int i=(2*x-1); i<=(2*(x+k)-1) ; i++) {
if(board[2*(y+k)-1][i] != '*') {
return false;
}
}
for(int i=(2*y-1); i<=(2*(y+k)-1) ; i++) {
if(board[i][2*(x+k)-1] != '*') {
return false;
}
}
for(int i=(2*y-1); i<=(2*(y+k)-1) ; i++) {
if(board[i][2*x-1] != '*') {
return false;
}
}
}
int main () {
int m,n,i,j,k,sum,cases = 0;
while(cin >> n) {
bool one = false;
for(i=0; i<MAX; i++) { //初始化数组
for(j=0; j<MAX; j++) {
board[i][j] = ' ';
}
}
cin >> m; //指令读入
for(k=0; k<m; k++) {
cin >> temp >> i >> j;
board[2*i-1][2*j-1]='*';
if(temp == 'H') {
board[2*i-1][2*j]='*';
board[2*i-1][2*j+1]='*';
}
if(temp == 'V') {
board[2*j][2*i-1]='*';
board[2*j+1][2*i-1]='*';
}
}
if(cases != 0) {
cout << "\n**********************************\n\n";
}
cout<< "Problem #" << ++cases << "\n\n" ;
for (k=1; k<=n; k++) { //查找各个边长的正方形
sum = 0;
for(i=1; (i+k)<=n; i++) {
for(j=1; (j+k)<=n; j++) {
if(square(i,j,k)) {
sum++;
}
}
}
if(sum != 0) {
one = true;
cout << sum <<" square (s) of size "<< k <<"\n";
}
}
if(one == false) {
cout <<"No completed squares can be found.\n";
}
}
return 0;
}
1.一开始认为是模拟,但一直没有思路,线跟点不好区分
2.阔然开朗,跟象棋那题有部分相像,有了思路,一开始是10*10模拟点(没考虑线)
3.后来把点加倍了,一部分点做线,注意 i,j的意义
4.格式调了几次(换行处多了一个空格,找了几次才发现)
思路:
点与点之间的点作为线段,根据边长遍历每一个点(四条线),求和输出
代码: