//#include <algorithm>
#include <iostream>
//#include <cstdlib>
//#include <cstring>
#include <cstdio>
//#include <cmath>
(2) 当 scanf 中的输入格式说明符 (Format specifiers) 是 "%c"的时候,那么空白字符 (whitespace) 将会被正常读入,不再起到分隔符的作用。
(3) 使用 cin 的时候,空白字符都会当成分隔符而被忽略。 */
int H[10][10];
int V[10][10];
int main()
{
int n,m,x,y,T = 0;
char c;
while (~scanf("%d%d",&n,&m)) {
getchar(); //取走换行符
for (int i = 1 ; i <= n ; ++ i)
for (int j = 1 ; j <= n ; ++ j)
V[i][j] = H[i][j] = 0;
for (int i = 1 ; i <= m ; ++ i) {
scanf("%c%d%d",&c,&x,&y);
getchar(); //取走换行符或者空格
if (c == 'H')
H[x][y] = 1;
else
V[y][x] = 1; //V[x][y]是倒过来的
}
/* while (~scanf("%d%d",&n,&m)) {
for (int i = 1 ; i <= n ; ++ i)
for (int j = 1 ; j <= n ; ++ j)
V[i][j] = H[i][j] = 0;
for (int i = 1 ; i <= m ; ++ i) {
cin>>c>>x>>y;
if (c == 'H')
H[x][y] = 1;
else
V[y][x] = 1;
} */
//注释部分和上面while部分等价
if (T ++) printf("\n**********************************\n\n");
printf("Problem #%d\n\n",T);
int sum = 0;
for (int K= 1 ; K <= n ; ++K) { //K是正方形的边长
int count = 0,flag = 0;
for (int i = 1 ; i+K<= n ; ++i) //先判断后执行 ,因为n是点的行和列数,所以边长K最大应该比n小1
for (int j = 1 ; j+K<= n ; ++ j) { //先判断后执行
flag = 1;
for (int h = j ; h < j+K; ++ h)
if (!H[i][h] || !H[i+K][h]) flag = 0; //分别表示该正方形的第一横行和最后的横行
for (int v = i ; v < i+K; ++ v)
if (!V[v][j] || !V[v][j+K]) flag = 0; //分别表示该正方形的第一列和最后一列
count += flag;
}
sum += count;
if (count) printf("%d square (s) of size %d\n",count,K);
}
if (!sum) printf("No completed squares can be found.\n");
}
return 0;
}
#include <iostream>
//#include <cstdlib>
//#include <cstring>
#include <cstdio>
//#include <cmath>
using namespace std;
//代码中有注释部分是对scanf和cin在读取空格上的不同处的应用(这是一开始我自己忽略的部分,所以特意整理了一下)
/*(1) 当 scanf 中的输入格式说明符 (Format specifiers) 不是 "%c"的时候,那么空白字符 (whitespace) 将起到分隔符的作用。把分隔好的两个数据分别赋值到各自定义好的变量或数组中去,两个数据之间的 whitespace 被从缓冲区读出但是不起任何作用,当然最后一个 '/n' 会被留在缓冲区内,除非用 getchar(); 或 scanf("%c",&ch); 把它读出来。(2) 当 scanf 中的输入格式说明符 (Format specifiers) 是 "%c"的时候,那么空白字符 (whitespace) 将会被正常读入,不再起到分隔符的作用。
(3) 使用 cin 的时候,空白字符都会当成分隔符而被忽略。 */
int H[10][10];
int V[10][10];
int main()
{
int n,m,x,y,T = 0;
char c;
while (~scanf("%d%d",&n,&m)) {
getchar(); //取走换行符
for (int i = 1 ; i <= n ; ++ i)
for (int j = 1 ; j <= n ; ++ j)
V[i][j] = H[i][j] = 0;
for (int i = 1 ; i <= m ; ++ i) {
scanf("%c%d%d",&c,&x,&y);
getchar(); //取走换行符或者空格
if (c == 'H')
H[x][y] = 1;
else
V[y][x] = 1; //V[x][y]是倒过来的
}
/* while (~scanf("%d%d",&n,&m)) {
for (int i = 1 ; i <= n ; ++ i)
for (int j = 1 ; j <= n ; ++ j)
V[i][j] = H[i][j] = 0;
for (int i = 1 ; i <= m ; ++ i) {
cin>>c>>x>>y;
if (c == 'H')
H[x][y] = 1;
else
V[y][x] = 1;
} */
//注释部分和上面while部分等价
if (T ++) printf("\n**********************************\n\n");
printf("Problem #%d\n\n",T);
int sum = 0;
for (int K= 1 ; K <= n ; ++K) { //K是正方形的边长
int count = 0,flag = 0;
for (int i = 1 ; i+K<= n ; ++i) //先判断后执行 ,因为n是点的行和列数,所以边长K最大应该比n小1
for (int j = 1 ; j+K<= n ; ++ j) { //先判断后执行
flag = 1;
for (int h = j ; h < j+K; ++ h)
if (!H[i][h] || !H[i+K][h]) flag = 0; //分别表示该正方形的第一横行和最后的横行
for (int v = i ; v < i+K; ++ v)
if (!V[v][j] || !V[v][j+K]) flag = 0; //分别表示该正方形的第一列和最后一列
count += flag;
}
sum += count;
if (count) printf("%d square (s) of size %d\n",count,K);
}
if (!sum) printf("No completed squares can be found.\n");
}
return 0;
}