五子棋判断 五子连珠

题目链接:https://ac.nowcoder.com/acm/contest/331/B
题目大意:

思路:因为N太大。二维数组肯定是开不下。所以用map存就可以了。

当时就去写了二百多行的代码,太暴力了。把五子棋所有可能形成五子连珠的情况都写出来的。

后来看了一些大佬的写法,找了简单的方法遍历五子棋的棋盘:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define p1 first
#define p2 second
//memset(a, 0, sizeof(a));
//stack堆栈 queue队列 priority_queue优先队列
//vector向量 multiset平衡二叉树 deque双端队列
//pair{T1 first;T2 second;} greater<T>
//unordered_map 哈希map

unordered_map<int, int> e[300005];
int dis[2][8]={-1, 1, 0, 0, 1, -1, -1, 1,
               -1, 1, 1,-1, 0,  0,  1,-1};
int n, m, x, y;

int dfs(int x, int y, int z)
{
    z=(z%2)?1:2;
    for(int i=0;i<8;i+=2)
    {
        int a=0, b=0;             //左侧与右侧的棋子数量

        int xx=x+dis[0][i], yy=y+dis[1][i];
        while(xx>=1&&xx<=n&&yy>=1&&yy<=n&&e[xx][yy]==z)
        {
            a++, xx+=dis[0][i], yy+=dis[1][i];
        }

        xx=x+dis[0][i+1], yy=y+dis[1][i+1];
        while(xx>=1&&xx<=n&&yy>=1&&yy<=n&&e[xx][yy]==z)
        {
            b++, xx+=dis[0][i+1], yy+=dis[1][i+1];
        }

        if(a+b>=4)               //>=4满足五子棋
        {
            return 1;
        }
    }

    return 0;
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&x,&y);
        printf("%c\n",(dfs(x, y, i))==1?'Y':'N');
        e[x][y]=(i%2)?1:2;
    }

    return 0;
}

原来的代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define p1 first
#define p2 second
//memset(a, 0, sizeof(a));
//stack堆栈 queue队列 priority_queue优先队列
//vector向量 multiset平衡二叉树 deque双端队列
//pair{T1 first;T2 second;} greater<T>
//unordered_map 哈希map

multimap<pair<int, int>, int> s1;
multimap<pair<int, int>, int> s2;

int dfs1(int x, int y)
{
    if(s1.find(make_pair(x, y-1))!=s1.end()&&s1.find(make_pair(x, y-2))!=s1.end()&&s1.find(make_pair(x, y-3))!=s1.end()&&s1.find(make_pair(x, y-4))!=s1.end())
    {
        return 1;
    }
    if(s1.find(make_pair(x, y-1))!=s1.end()&&s1.find(make_pair(x, y-2))!=s1.end()&&s1.find(make_pair(x, y-3))!=s1.end()&&s1.find(make_pair(x, y+1))!=s1.end())
    {
        return 1;
    }
    if(s1.find(make_pair(x, y-1))!=s1.end()&&s1.find(make_pair(x, y-2))!=s1.end()&&s1.find(make_pair(x, y+2))!=s1.end()&&s1.find(make_pair(x, y+1))!=s1.end())
    {
        return 1;
    }
    if(s1.find(make_pair(x, y-1))!=s1.end()&&s1.find(make_pair(x, y+3))!=s1.end()&&s1.find(make_pair(x, y+2))!=s1.end()&&s1.find(make_pair(x, y+1))!=s1.end())
    {
        return 1;
    }
    if(s1.find(make_pair(x, y+4))!=s1.end()&&s1.find(make_pair(x, y+3))!=s1.end()&&s1.find(make_pair(x, y+2))!=s1.end()&&s1.find(make_pair(x, y+1))!=s1.end())
    {
        return 1;
    }


    if(s1.find(make_pair(x-1, y))!=s1.end()&&s1.find(make_pair(x-2, y))!=s1.end()&&s1.find(make_pair(x-3, y))!=s1.end()&&s1.find(make_pair(x-4, y))!=s1.end())
    {
        return 1;
    }
    if(s1.find(make_pair(x-1, y))!=s1.end()&&s1.find(make_pair(x-2, y))!=s1.end()&&s1.find(make_pair(x-3, y))!=s1.end()&&s1.find(make_pair(x+1, y))!=s1.end())
    {
        return 1;
    }
    if(s1.find(make_pair(x-1, y))!=s1.end()&&s1.find(make_pair(x-2, y))!=s1.end()&&s1.find(make_pair(x+2, y))!=s1.end()&&s1.find(make_pair(x+1, y))!=s1.end())
    {
        return 1;
    }
    if(s1.find(make_pair(x-1, y))!=s1.end()&&s1.find(make_pair(x+3, y))!=s1.end()&&s1.find(make_pair(x+2, y))!=s1.end()&&s1.find(make_pair(x+1, y))!=s1.end())
    {
        return 1;
    }
    if(s1.find(make_pair(x+4, y))!=s1.end()&&s1.find(make_pair(x+3, y))!=s1.end()&&s1.find(make_pair(x+2, y))!=s1.end()&&s1.find(make_pair(x+1, y))!=s1.end())
    {
        return 1;
    }


    if(s1.find(make_pair(x-1, y-1))!=s1.end()&&s1.find(make_pair(x-2, y-2))!=s1.end()&&s1.find(make_pair(x-3, y-3))!=s1.end()&&s1.find(make_pair(x-4, y-4))!=s1.end())
    {
        return 1;
    }
    if(s1.find(make_pair(x-1, y-1))!=s1.end()&&s1.find(make_pair(x-2, y-2))!=s1.end()&&s1.find(make_pair(x-3, y-3))!=s1.end()&&s1.find(make_pair(x+1, y+1))!=s1.end())
    {
        return 1;
    }
    if(s1.find(make_pair(x-1, y-1))!=s1.end()&&s1.find(make_pair(x-2, y-2))!=s1.end()&&s1.find(make_pair(x+2, y+2))!=s1.end()&&s1.find(make_pair(x+1, y+1))!=s1.end())
    {
        return 1;
    }
    if(s1.find(make_pair(x-1, y-1))!=s1.end()&&s1.find(make_pair(x+3, y+3))!=s1.end()&&s1.find(make_pair(x+2, y+2))!=s1.end()&&s1.find(make_pair(x+1, y+1))!=s1.end())
    {
        return 1;
    }
    if(s1.find(make_pair(x+4, y+4))!=s1.end()&&s1.find(make_pair(x+3, y+3))!=s1.end()&&s1.find(make_pair(x+2, y+2))!=s1.end()&&s1.find(make_pair(x+1, y+1))!=s1.end())
    {
        return 1;
    }

    if(s1.find(make_pair(x-1, y+1))!=s1.end()&&s1.find(make_pair(x-2, y+2))!=s1.end()&&s1.find(make_pair(x-3, y+3))!=s1.end()&&s1.find(make_pair(x-4, y+4))!=s1.end())
    {
        return 1;
    }
    if(s1.find(make_pair(x-1, y+1))!=s1.end()&&s1.find(make_pair(x-2, y+2))!=s1.end()&&s1.find(make_pair(x-3, y+3))!=s1.end()&&s1.find(make_pair(x+1, y-1))!=s1.end())
    {
        return 1;
    }
    if(s1.find(make_pair(x-1, y+1))!=s1.end()&&s1.find(make_pair(x-2, y+2))!=s1.end()&&s1.find(make_pair(x+2, y-2))!=s1.end()&&s1.find(make_pair(x+1, y-1))!=s1.end())
    {
        return 1;
    }
    if(s1.find(make_pair(x-1, y+1))!=s1.end()&&s1.find(make_pair(x+3, y-3))!=s1.end()&&s1.find(make_pair(x+2, y-2))!=s1.end()&&s1.find(make_pair(x+1, y-1))!=s1.end())
    {
        return 1;
    }
    if(s1.find(make_pair(x+4, y-4))!=s1.end()&&s1.find(make_pair(x+3, y-3))!=s1.end()&&s1.find(make_pair(x+2, y-2))!=s1.end()&&s1.find(make_pair(x+1, y-1))!=s1.end())
    {
        return 1;
    }

    return 0;

}

int dfs2(int x, int y)
{
    if(s2.find(make_pair(x, y-1))!=s2.end()&&s2.find(make_pair(x, y-2))!=s2.end()&&s2.find(make_pair(x, y-3))!=s2.end()&&s2.find(make_pair(x, y-4))!=s2.end())
    {
        return 1;
    }
    if(s2.find(make_pair(x, y-1))!=s2.end()&&s2.find(make_pair(x, y-2))!=s2.end()&&s2.find(make_pair(x, y-3))!=s2.end()&&s2.find(make_pair(x, y+1))!=s2.end())
    {
        return 1;
    }
    if(s2.find(make_pair(x, y-1))!=s2.end()&&s2.find(make_pair(x, y-2))!=s2.end()&&s2.find(make_pair(x, y+2))!=s2.end()&&s2.find(make_pair(x, y+1))!=s2.end())
    {
        return 1;
    }
    if(s2.find(make_pair(x, y-1))!=s2.end()&&s2.find(make_pair(x, y+3))!=s2.end()&&s2.find(make_pair(x, y+2))!=s2.end()&&s2.find(make_pair(x, y+1))!=s2.end())
    {
        return 1;
    }
    if(s2.find(make_pair(x, y+4))!=s2.end()&&s2.find(make_pair(x, y+3))!=s2.end()&&s2.find(make_pair(x, y+2))!=s2.end()&&s2.find(make_pair(x, y+1))!=s2.end())
    {
        return 1;
    }


    if(s2.find(make_pair(x-1, y))!=s2.end()&&s2.find(make_pair(x-2, y))!=s2.end()&&s2.find(make_pair(x-3, y))!=s2.end()&&s2.find(make_pair(x-4, y))!=s2.end())
    {
        return 1;
    }
    if(s2.find(make_pair(x-1, y))!=s2.end()&&s2.find(make_pair(x-2, y))!=s2.end()&&s2.find(make_pair(x-3, y))!=s2.end()&&s2.find(make_pair(x+1, y))!=s2.end())
    {
        return 1;
    }
    if(s2.find(make_pair(x-1, y))!=s2.end()&&s2.find(make_pair(x-2, y))!=s2.end()&&s2.find(make_pair(x+2, y))!=s2.end()&&s2.find(make_pair(x+1, y))!=s2.end())
    {
        return 1;
    }
    if(s2.find(make_pair(x-1, y))!=s2.end()&&s2.find(make_pair(x+3, y))!=s2.end()&&s2.find(make_pair(x+2, y))!=s2.end()&&s2.find(make_pair(x+1, y))!=s2.end())
    {
        return 1;
    }
    if(s2.find(make_pair(x+4, y))!=s2.end()&&s2.find(make_pair(x+3, y))!=s2.end()&&s2.find(make_pair(x+2, y))!=s2.end()&&s2.find(make_pair(x+1, y))!=s2.end())
    {
        return 1;
    }


    if(s2.find(make_pair(x-1, y-1))!=s2.end()&&s2.find(make_pair(x-2, y-2))!=s2.end()&&s2.find(make_pair(x-3, y-3))!=s2.end()&&s2.find(make_pair(x-4, y-4))!=s2.end())
    {
        return 1;
    }
    if(s2.find(make_pair(x-1, y-1))!=s2.end()&&s2.find(make_pair(x-2, y-2))!=s2.end()&&s2.find(make_pair(x-3, y-3))!=s2.end()&&s2.find(make_pair(x+1, y+1))!=s2.end())
    {
        return 1;
    }
    if(s2.find(make_pair(x-1, y-1))!=s2.end()&&s2.find(make_pair(x-2, y-2))!=s2.end()&&s2.find(make_pair(x+2, y+2))!=s2.end()&&s2.find(make_pair(x+1, y+1))!=s2.end())
    {
        return 1;
    }
    if(s2.find(make_pair(x-1, y-1))!=s2.end()&&s2.find(make_pair(x+3, y+3))!=s2.end()&&s2.find(make_pair(x+2, y+2))!=s2.end()&&s2.find(make_pair(x+1, y+1))!=s2.end())
    {
        return 1;
    }
    if(s2.find(make_pair(x+4, y+4))!=s2.end()&&s2.find(make_pair(x+3, y+3))!=s2.end()&&s2.find(make_pair(x+2, y+2))!=s2.end()&&s2.find(make_pair(x+1, y+1))!=s2.end())
    {
        return 1;
    }

    if(s2.find(make_pair(x-1, y+1))!=s2.end()&&s2.find(make_pair(x-2, y+2))!=s2.end()&&s2.find(make_pair(x-3, y+3))!=s2.end()&&s2.find(make_pair(x-4, y+4))!=s2.end())
    {
        return 1;
    }
    if(s2.find(make_pair(x-1, y+1))!=s2.end()&&s2.find(make_pair(x-2, y+2))!=s2.end()&&s2.find(make_pair(x-3, y+3))!=s2.end()&&s2.find(make_pair(x+1, y-1))!=s2.end())
    {
        return 1;
    }
    if(s2.find(make_pair(x-1, y+1))!=s2.end()&&s2.find(make_pair(x-2, y+2))!=s2.end()&&s2.find(make_pair(x+2, y-2))!=s2.end()&&s2.find(make_pair(x+1, y-1))!=s2.end())
    {
        return 1;
    }
    if(s2.find(make_pair(x-1, y+1))!=s2.end()&&s2.find(make_pair(x+3, y-3))!=s2.end()&&s2.find(make_pair(x+2, y-2))!=s2.end()&&s2.find(make_pair(x+1, y-1))!=s2.end())
    {
        return 1;
    }
    if(s2.find(make_pair(x+4, y-4))!=s2.end()&&s2.find(make_pair(x+3, y-3))!=s2.end()&&s2.find(make_pair(x+2, y-2))!=s2.end()&&s2.find(make_pair(x+1, y-1))!=s2.end())
    {
        return 1;
    }

    return 0;

}

int main()
{
    int n, m, x, y;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&x,&y);
        if(i%2==1)
        {
            if(dfs1(x, y))
            {
                printf("Y\n");
                s1.insert(make_pair(make_pair(x, y), 1));
            }
            else
            {
                printf("N\n");
                s1.insert(make_pair(make_pair(x, y), 1));
            }
        }
        else
        {
            if(dfs2(x, y))
            {
                printf("Y\n");
                s2.insert(make_pair(make_pair(x, y), 1));
            }
            else
            {
                printf("N\n");
                s2.insert(make_pair(make_pair(x, y), 1));
            }
        }
    }

    return 0;

}

全部评论

相关推荐

Gaynes:查看图片
点赞 评论 收藏
分享
点赞 评论 收藏
分享
小时候觉得老师是很伟大的职业&nbsp;感觉老师都是人中龙凤才能当&nbsp;后来考入大学&nbsp;发现以前的老同学也是公费师范生了&nbsp;他们什么样什么人品&nbsp;我还不清楚吗&nbsp;只能希望他们以后也会有改变&nbsp;要不纯属耽误孩子&nbsp;实习之后发现&nbsp;有的领导&nbsp;能当上领导也可能运气成分很多&nbsp;自己决策方面很差&nbsp;分配给属下的东西自己也说不明白&nbsp;&nbsp;前些年那些明星&nbsp;各种塌房&nbsp;少林寺大师都能有情人和孩子&nbsp;越长大越发现世界就是个草台班子&nbsp;以前对不懂的东西有一层羡慕的滤镜&nbsp;接触之后发现就不是那回事了
RazerYang:其实也是幸存者偏差,你只关注草台班子的部分,所以觉得世界都是草台班子。实际上你每天能安全地从床上醒来,有稳定的天然气、自来水和电力供应,能让你吃上热乎的饭菜,能收到持续稳定的信号去刷手机,花几块钱就能坐地铁从城市的一端快速移动到另一端,花几百块就能在一天之内安全穿越整个国家,这都不是一个草台班子能实现的。燃气、水利、电力、通信、公交、民航,还有最重要的公安和国防,这些都不是草台班子能做的,有无数普通人构筑了你生活的方方面面,而你也将加入他们。
我对___祛魅了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务