*未按照题目的格式。
/*整体思路:枚举法,扫描全部的点,用size代表每次检查的正方形边长,依次检查是否满足题意*/
#include<iostream>
using namespace std;
int H[10][10];
int V[10][10];
void Edge(char Edge,int i,int j){
if (Edge == 'H'){
H[i][j] = 1;
}
if (Edge == 'V'){
V[i][j] = 1;
}
}
int main()
{
int n, number;//边长,边数
int x, y;//坐标
char edge;
cin >> n >> number;
while (number--){
cin >> edge >> x >> y;
Edge(edge, x, y);
}
int exist = 0, sign = 1;
for (int size = 1; size <n; size++)
{
int count = 0;
for (int i = 1; i + size <= n; i++)
for (int j = 1; j + size <= n; j++)
{
sign = 1;
for (int p = j; p < j + size;p++)
{
if (H[i][p] != 1 || H[i + size][p] != 1){//检查(2*size)条平行边是否都存在. p使其往右移动,size往下移动检查
sign = 0;
break;
}
}
if (sign)
{
for (int p = i; p < i + size; p++)
{
if (V[p][j] != 1 || V[p][j + size] != 1) //垂直边从上往下相连,所以"连续"变化的应该是‘行’p+1, i+size"跨越"变化应该是‘列’
{
sign = 0;
break;
}
}
}
if (sign)
{
count++;
exist=1;
}
}
if (sign){
cout << "The number of size<" << size << ">is:" << count++ << endl;
}
}
if (!exist)
{
cout << "No exist" << endl;
}
system("pause");
return 0;
}
提供如下控制台输入,直接复制即可.
3 12
H 1 1
H 1 2
H 2 1
H 2 2
H 3 1
H 3 2
V 1 1
V 1 2
V 1 3
V 2 1
V 2 2
V 2 3
4 4
H 1 1
H 2 1
V 1 1
V 1 2
4 16
H 1 1
H 1 3
H 2 1
H 2 2
H 2 3
H 3 2
H 4 2
H 4 3
V 1 1
V 1 2
V 1 4
V 2 2
V 2 3
V 2 4
V 3 2
V 3 4