连连看 赛码网 1175

来源:互联网 发布:c语言教学视频哪个好 编辑:程序博客网 时间:2024/06/07 02:36

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

题目链接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;}


0 0
原创粉丝点击