連連看 賽碼網 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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章