UVa201

 //#include <algorithm>  
#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;  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值