zoukankan      html  css  js  c++  java
  • 杭电1175简单搜索 连连看

    连连看

    Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 34807 Accepted Submission(s): 8657

    Problem Description
    “连连看”相信很多人都玩过。没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子。如果某两个相同的棋子,可以通过一条线连起来(这条线不能经过其它棋子),而且线的转折次数不超过两次,那么这两个棋子就可以在棋盘上消去。不好意思,由于我以前没有玩过连连看,咨询了同学的意见,连线不能从外面绕过去的,但事实上这是错的。现在已经酿成大祸,就只能将错就错了,连线不能从外围绕过。
    玩家鼠标先后点击两块棋子,试图将他们消去,然后游戏的后台判断这两个方格能不能消去。现在你的任务就是写这个后台程序。

    Input
    输入数据有多组。每组数据的第一行有两个正整数n,m(0

    #include<iostream>
    #include<algorithm>
    #include<queue>
    #include<cstring>
    using namespace std;
    struct node
    {
        int a,b,num;
    }as,t,h;
    int w[1001][1001];//储存 连连看数据
    int w1[1001][1001];//标记是否走过
    int k,n,m,l;
    int x,y,e,f;
    int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
    void dfs()
    {
        queue<node>q;
        q.push(h);//判断连连看 一个数据入队
        w1[x][y]=1;//标记
        while(!q.empty())
        {
            as=q.front();
            q.pop();
            for(int i=0;i<4;i++)//向四个方向搜索
            {
                t.a=as.a+dir[i][0];
                t.b=as.b+dir[i][1];
                t.num=as.num;
                while(w[t.a][t.b]==0&&t.a>=1&&t.a<=n&&t.b>=1&&t.b<=m&&t.num<3&&w1[t.a][t.b]==0)
                {//在满足条件的情况下(w【t.a】【t.b】=0且不出境和没有搜索过)可以不计步数
                    w1[t.a][t.b]=1;//标记状态
                    t.num+=1;//计步 以便入队 向别的方向搜索
                    q.push(t);
                    t.num-=1;//你懂的 (⊙o⊙)
                    t.a+=dir[i][0];
                    t.b+=dir[i][1];
                }
                if(t.a==e&&t.b==f&&t.num<3)//到达另一个且步数小于等同于2
                {
                    cout<<"YES"<<endl;
                    return ;
                }
            }
        }
        cout<<"NO"<<endl;
        return ;
    }
    int main()
    {
        while(cin>>n>>m)
        {
            if(n==0&&m==0)
                break;
            memset(w,0,sizeof(w));
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=m;j++)
                    cin>>w[i][j];
            }
            cin>>l;
            while(l--)
            {
                cin>>x>>y>>e>>f;
                memset(w1,0,sizeof(w1));
                if(w[x][y]!=w[e][f])//俩个不相同 就没必要搜索了
                    cout<<"NO"<<endl;
                else if(x==e&&y==f)//俩个是一个 就等没必要搜索了
                    cout<<"NO"<<endl;
                else if(w[x][y]==0&&w[e][f]==0)//空白就更没必要了
                    cout<<"NO"<<endl;
                else
                {
                    h.a=x;
                    h.b=y;
                    h.num=0;
                    dfs();
                }
            }
        }
        return 0;
    }
    
  • 相关阅读:
    Python 类中方法的内部变量,命名加'self.'变成 self.xxx 和不加直接 xxx 的区别
    用foreach遍历 datagridView 指定列所有的内容
    treeView1.SelectedNode.Level
    YES NO 上一个 下一个
    正则 单词全字匹配查找 reg 边界查找 精确匹配 只匹配字符 不含连续的字符
    抓取2个字符串中间的字符串
    sqlite 60000行 插入到数据库只用不到2秒
    将多行文本以单行的格式保存起来 读和写 ini
    将秒转换成时间格式
    richtextbox Ctrl+V只粘贴纯文本格式
  • 原文地址:https://www.cnblogs.com/nanfenggu/p/7900183.html
Copyright © 2011-2022 走看看