连连看 赛码网 1175

喜欢做这种和游戏有关的题目 觉得像打游戏一样有趣

题目链接http://acm.acmcoder.com/showproblem.php?pid=1175

#include <iostream>
#include <cstdio>
using namespace std;
int map[1005][1005];
int main()
{
    int m,n;
    bool flag1,flag2,flag3;
    freopen("in.txt","r",stdin);
    scanf("%d%d",&m,&n);
    while(m!=0&&n!=0)
    {
        for(int i=1;i<=m;i++)
        for(int j=1;j<=n;j++)
            scanf("%d",&map[i][j]);
        int c;
        scanf("%d",&c);
        for(int i=0;i<c;i++)
        {
            int x1,y1,x2,y2;
            scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
            bool ans = 0;
            if(map[x1][y1]!=map[x2][y2]||map[x1][y1]==0||map[x2][y2]==0) //两次点击的图案不同或者图案为空白则不能被消去
            {
                ans=0;
                printf("NO\n");
                continue;
            }
               int minx,maxx;
                if(x1>x2)
                {
                    maxx=x1;
                    minx=x2;
                }
                else{
                    minx=x1;
                    maxx=x2;
                }

            int miny,maxy;
                if(y1>y2)
                {
                    maxy=y1;
                    miny=y2;
                }
                else{
                    miny=y1;
                    maxy=y2;
                }
            if(x1==x2) //只需要连一条线的情况
            {
                ans=1;
                for(int j=miny+1;j<maxy;j++)
                {
                    if(map[x1][j]!=0)
                    {
                        ans=0;
                        break;
                    }
                }
                if(ans==1)
                {
                    printf("YES\n");
                    continue;
                }
            }
             if(y1==y2)
            {
                ans=1;
                for(int j=minx+1;j<maxx;j++)
                {
                    if(map[j][y1]!=0)
                    {
                        ans=0;
                        break;
                    }
                }
                if(ans==1)
                {
                    printf("YES\n");
                    continue;
                }
            }
            int ex;
            if(x1>x2)
            {
                ex=x1;
                x1=x2;
                x2=ex;
                ex=y1;
                y1=y2;
                y2=ex;
            }

            for(int i=1;i<=m;i++)//竖横竖三条连线的情况 flag1是横线 flag2 flag3分别是两条竖线
            {
                flag1 = 1;


                for(int j=miny+1;j<maxy;j++)// 画横线
                {
                    if(map[i][j]!=0)
                    {
                        flag1=0;
                        break;
                    }
                }
                if(flag1==1) //存在横线的时候才考虑竖线
                {
                    flag2=1;

                    //画x1y1到达横线的竖线
                    if(i>x1)//因为横线可能在两点之上 中间 或者两点之下 所以竖线的起始终止坐标要分情况讨论
                    {
                        for(int j=x1+1;j<=i;j++)
                        if(map[j][y1]!=0)
                        {
                            flag2=0;
                            break;
                        }
                    }
                    else //i==x1的这种情况也包括在内 也就是两条线的情况
                    {
                       for(int j=i;j<x1;j++)
                        if(map[j][y1]!=0)
                        {
                            flag2=0;
                            break;
                        }
                    }

                    flag3=1;
                    //画x2y2到横线的竖线
                    if(i>x2)
                    {
                        for(int j=x2+1;j<=i;j++)
                        {
                            if(map[j][y2]!=0)
                            {
                                flag3=0;
                                break;
                            }
                        }
                    }
                    else
                    {
                        for(int j=i;j<x2;j++)
                        {
                            if(map[j][y2]!=0)
                            {
                                flag3=0;
                                break;
                            }
                        }
                    }

                    if(flag2==1&&flag3==1)//三条线同时存在才可以消去
                    {
                        ans=1;
                        break;//只要找到这样的连线就确定可以消去
                    }
                }
            }
            if(ans==1)
            {
               // printf("heng---%d%d%d",flag1,flag2,flag3);
                printf("YES\n");
                continue;
            }
            if(y1>y2)
            {
                ex=x1;
                x1=x2;
                x2=ex;
                ex=y1;
                y1=y2;
                y2=ex;
            }
             for(int i=1;i<=n;i++) //横竖横的情况
            {
                flag1 = 1;


                for(int j=minx;j<=maxx;j++)//画竖线
                {
                    if(map[j][i]!=0)
                    {
                        flag1=0;
                        break;
                    }
                }
                if(flag1==1)
                {
                    flag2=1;

                    if(i>y1)//横线1
                    {
                        for(int j=y1+1;j<=i;j++)
                        if(map[x1][j]!=0)
                        {
                            flag2=0;
                            break;
                        }
                    }
                    else
                    {
                        for(int j=i;j<y1;j++)
                        if(map[x1][j]!=0)
                        {
                            flag2=0;
                            break;
                        }
                    }

                    flag3=1;

                    if(i>y2)//横线2
                    {
                       for(int j=y2+1;j<=i;j++)
                        {
                            if(map[x2][j]!=0)
                            {
                                flag3=0;
                                break;
                            }
                        }
                    }
                    else
                    {
                        for(int j=i;j<y2;j++)
                        {
                            if(map[x2][j]!=0)
                            {
                                flag3=0;
                                break;
                            }
                        }
                    }

                    if(flag2==1&&flag3==1)
                    {
                        ans=1;
                        break;
                    }
                }
            }
          // printf("shu---%d%d%d",flag1,flag2,flag3);
            if(ans==1) printf("YES\n");
            else printf("NO\n");//所有情况都不可能才输出no

        }
        scanf("%d%d",&m,&n);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值