C 眼力大作战

C  眼力大作战

Time Limit:1000MS  Memory Limit:65535K

题型: 编程题   语言: 无限制

描述

某一天,bsc要给集训队表现出色的cdm和xxy发奖品了,可是bsc只有一件奖品,不能同时分给两个人,所以只能想个办法来决定谁来领奖品了。
Bsc给了一张表格,里面填满了各种大写字母,要求从里面找出一个正方形,其中正方形的左上顶点对应字符S,右上顶点对应字符C,左下顶点
对应字符A,右下顶点对应U,并且在该正方形区域内存在一个三角形,其中位置(i,j)对应字符A,(i+1,j-1)对应字符C,(i+1,j+1)对应字符M。
谁先找到呢,就算谁获胜了。但是呢,由于xxy最近要忙于期末复习了,所以没有时间处理这种小问题,但是xxy还是很希望能拿到奖品的,
所以只能求助未来的Acmer,你啦!

输入格式

第一行一个整数T,表示样例数
第二行两个整数n, m,分别表示bsc给的表格的行数和列数 1 <= n <= 15,  1 <= m <= 15
第三到n + 2行,每一行是m个大写字母

输出格式

输出T行,若表格中符合上述要求,输出 ”Yes”, 否则输出”No”   (不包括双引号)

输入样例

2
3 3
SAC
CMM
AMU
7 5
MUSUB
SSMSS
CMXUU
UCSCC
MACCA
ACCMM
SUGCM

输出样例

Yes
No
思路:用了暴力枚举,因为当时实在没想到什么好的方法。我们先分析下题目,我们必须先找出这样的正方形,然后再从正方形中找出‘ACM’。
注意题目条件的“正方形”字眼,正方形每条边都相等,你想到了什么?没错,如果说我找到‘S’,我就令‘s’的坐标是(x.y),那么其他字符的位置就是(x+k,y),(x+k,y+k),(x,y+k),(k=1,2,3……)我们只要枚举k检测这三个位置是否满足要求,if满足的话,再枚举就可以了。
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int T;
    int i,j,k,d,n,m,p1,q1,l,flag=0;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        getchar();
        char test[20][20]={'\0'};
        for(i=0;i<n;i++)
              scanf("%s",test[i]);
        for(i=0;i<n;i++)
        {
        for(j=0;j<m;j++)
        {
                if(test[i][j]=='S')
                {
                        p1=i;
                        q1=j;
                for(d=2;;d++)
                {
                        if(p1+d<n&&q1+d<m)
                        {
                                if(test[p1][q1+d]=='C'&&test[p1+d][q1]=='A'&& test[p1+d][q1+d]=='U')
                        {
                                for(k=p1;k<=p1+d;k++)
                                {
                                        for(l=q1+1;l<=q1+d;l++)
                                        {
                                                if(test[k][l]=='A'&&test[k+1][l-1]=='C'&&test[k+1][l+1]=='M')
                                                {
                                                        flag=1;
                                                        break;
                                                }

                                        }

                                }


                        }
                        }
                        else 
                        break;
                }

                         
                        }
        }
                if(flag==1)
                        break;
        }
        if(flag==0)
                printf("No\n");
        else
                printf("Yes\n");

          flag=0;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值