UVA201正方形

像我其他文章中写的一样,读题很重要,CSDN上有 紫书的原题资源。
这题我的思路是用数组存储线段,用r1,r2,c1,c2的值使不同的线段被储存。
(可以理解成不同的向量)这里写图片描述

#include<stdio.h>
#include<string.h>
#define maxn 12
#define c1 1       //此部分是我的解题
#define c2 10      //思想的核心
#define r1 100     //<---------
#define r2 1000    //<---------
int q[maxn][maxn],cnt[maxn],m,n;

int main()
{
    char cmd[2];
    int x,y,kase=0;
    while(scanf("%d %d",&n,&m)==2){
        memset(q,0,sizeof(q));
        memset(cnt,0,sizeof(cnt));
        while(m--){
            scanf("%s %d %d",cmd,&x,&y); //输入线段
            if(cmd[0]=='H'){
                q[x][y]+=r1;
                q[x][y+1]+=r2;
            }
            else{
                q[y][x]+=c1;
                q[y+1][x]+=c2;
            }
        }
        for(int i=1;i<=n;i++){//每个正方形从左上角开始判断
            for(int j=1;j<=n;j++){
                if(q[i][j]%r2>=r1 && q[i][j]%c2>=c1){  
                    search(i,j);//为r或c线段的第一条时
                }               //进行下面的判断
            }
        }
        printf("Problem #%d\n\n",++kase);//没怎么看输出格式,可能格式不标准
        int count=0;
        for(int i=1;i<=n;i++){
            if(cnt[i]){
                printf("%d square(s) of size %d\n",cnt[i],i);
                count++;
            }
        }
        if(!count)
            printf("No completed squares can be found\n");
        printf("\n");
        for(int i=0;i<34;i++)
            printf("*");
        printf("\n");
    }
    return 0;
}
void search(int x,int y)
{
    int i,j,mark;
    for(i=1;i<=n&&x+i<=n&&y+i<=n;i++){
        for(j=1,mark=1;j<=i;j++){
            if(q[x][y+j]/r2==0 || q[x+j][y]%r1<c2 || q[x+i][y+j]/r2==0 || q[x+j][y+i]%r1<c2)
                mark=0;
        }
        if(mark)
            cnt[i]++;
    }
}
/*sample input&output
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 2 1
V 2 2
V 2 3
V 3 2
V 4 1
V 4 2
V 4 3
2
3
H 1 1
H 2 1
V 1 2
*/


画出我上面的图能更好地理解。

未完待续。。。
如有错误纰漏,请指出

 

转载于:https://www.cnblogs.com/ZackBee/p/6443955.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值