下象棋题解

下象棋

https://www.nowcoder.com/questionTerminal/2b0f51e8b1594d7091576dab05e00693

题解1:AC
逆向思维思考,因为所有棋子都只能上下左右移动,所以为了判断牛牛的将能否被吃下,只需要判断牛牛的那一行与列的棋子情况即可。
具体来说:对于兵和将,只可能在牛牛的将的上下左右四个相邻的方向上才能取胜;
对于车来说,只可能在上下左右四个方向上并且与牛牛的将之间没有其他棋子时才能取胜;对于炮来说,只可能在上下左右四个方向上并且与牛牛的将之间有且仅有一个其他棋子时才能取胜。
所以我们可以扫描牛牛的将所在的位置,再对那一行一列进行判断。时间复杂度O(n*m),空间复杂度O(1)。

class Solution {
public:
    /**
     *
     * @param chessboard string字符串vector
     * @return string字符串
     */
    string playchess(vector<string>& chessboard) {
        // write code here
        int n = chessboard.size(), m = chessboard[0].size();
        vector<vector<int>>dir = { {0,-1},{0,1},{-1,0},{1,0} };
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                if (chessboard[i][j] == 'j')
                {
                    for (int k = 0; k < 4; k++)
                        for (int cnt = 0, nx = i + dir[k][0], ny = j + dir[k][1], l = 2;
                            nx >= 0 && nx < n && ny >= 0 && ny < m; nx = i + dir[k][0] * l, ny = j + dir[k][1] * l, l++)
                        {
                            if (((chessboard[nx][ny] == 'B' || chessboard[nx][ny] == 'J') && l == 2)
                                || (chessboard[nx][ny] == 'P' && cnt == 1) || (chessboard[nx][ny] == 'C' && !cnt))
                                return "Happy";
                            cnt += chessboard[nx][ny] != '.';
                            if (cnt > 1) break;
                        }
                    break;
                }
        return "Sad";
    }
};

题解2:AC
模拟即可,只需要分别判断牛妹的炮,将,兵,车能否攻下牛牛的将。
具体来说:对于兵和将,只可能在牛牛的将的上下左右四个相邻的方向上才能取胜;
对于车来说,只可能在上下左右四个方向上并且与牛牛的将之间没有其他棋子时才能取胜;对于炮来说,只可能在上下左右四个方向上并且与牛牛的将之间有且仅有一个其他棋子时才能取胜。
对地图分别按照轴与轴进行了离散化,对于每一个存储了他这一行/一列的棋子信息,然后只需要分别遍历离散化后轴与轴数组,看看每一类棋子能否攻下牛牛的将即可。时间复杂度,空间复杂度

class Solution {
public:
    /**
     * 
     * @param chessboard string字符串vector 
     * @return string字符串
     */
    string playchess(vector<string>& chessboard) {
        // write code here
        int n=chessboard.size();
        int m=chessboard[0].size();
        vector<pair<char,int>>x[n+1],y[m+1];
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            if(chessboard[i-1][j-1]!='.') x[i].push_back({chessboard[i-1][j-1],j});
        for(int j=1;j<=m;j++)
             for(int i=1;i<=n;i++)
                if(chessboard[i-1][j-1]!='.') y[j].push_back({chessboard[i-1][j-1],i});
        int fg=0;
        for(int i=1;i<=n;i++) {
            for(int j=0;j<x[i].size();j++) {
                char ch=x[i][j].first;
                if(ch=='P') {//炮
                    if(j-2>=0&&x[i][j-2].first=='j') fg=1;
                    if(j+2<x[i].size()&&x[i][j+2].first=='j') fg=1;
                }
                if(ch=='B'||ch=='J') {
                    if(j-1>=0&&x[i][j-1].first=='j'&&abs(x[i][j-1].second-x[i][j].second)==1) fg=1;
                    if(j+1<x[i].size()&&x[i][j+1].first=='j'&&abs(x[i][j+1].second-x[i][j].second)==1) fg=1;
                }
                if(ch=='C') {
                    if(j-1>=0&&x[i][j-1].first=='j') fg=1;
                    if(j+1<x[i].size()&&x[i][j+1].first=='j') fg=1;
                }
            }
        }
        for(int i=1;i<=m;i++) {
            for(int j=0;j<y[i].size();j++) {
                char ch=y[i][j].first;
                if(ch=='P') {//炮
                    if(j-2>=0&&y[i][j-2].first=='j') fg=1;
                    if(j+2<y[i].size()&&y[i][j+2].first=='j') fg=1;
                }
                if(ch=='B'||ch=='J') {
                    if(j-1>=0&&y[i][j-1].first=='j'&&abs(y[i][j-1].second-y[i][j].second)==1) fg=1;
                    if(j+1<y[i].size()&&y[i][j+1].first=='j'&&abs(y[i][j+1].second-y[i][j].second)==1) fg=1;
                }
                if(ch=='C') {
                    if(j-1>=0&&y[i][j-1].first=='j') fg=1;
                    if(j+1<y[i].size()&&y[i][j+1].first=='j') fg=1;
                }
            }
        }
        if(fg) return "Happy";
        else return "Sad";
    }
};
全部评论
能不能给程序多作一些注释,push_back({i,j})参数作何解释呀,push_back({chessboard[i-1][j-1],j})参数作何解释
点赞 回复 分享
发布于 2020-07-22 13:21

相关推荐

03-04 15:02
已编辑
南京大学 Java
3.3&nbsp;一面岗位:&nbsp;后台开发部门:&nbsp;腾讯云场景题偏多,没问项目,没手撕,时长半小时1.&nbsp;自我介绍2.&nbsp;Java基础:-&nbsp;Treemap&nbsp;&amp;&nbsp;HashMap区别-&nbsp;ArrayList,&nbsp;添加n个数(n较大),会发生什么(应该是想问ArrayList的扩容机制)-&nbsp;考虑扩容的情况下这个过程的复杂度多少(说明复杂度计算思路即可,不需要给出具体的复杂度)3.&nbsp;并发:-&nbsp;项目里怎么用多线程的(一开始答了具体场景,不过面试官想听的是线程池,Synchronized这些...)-&nbsp;volatile&nbsp;&amp;&nbsp;synchronized-&nbsp;这里还问了一个,不过忘了...-&nbsp;假设项目里用了很多synchronized拖慢了系统效率,让你重构项目,你怎么设计?&nbsp;(真不会,回了一个参考乐观锁的设计用版本号之类的,然后这个话题就过了)4.&nbsp;JVM-&nbsp;JVM垃圾回收,怎么判断对象有没有被引用?&nbsp;(可达性分析)-&nbsp;GC&nbsp;Root有哪些-&nbsp;遇到OOM怎么排查5.&nbsp;场景-&nbsp;设计一个数据结构,用于在搜索框中搜索人名(不知道是不是这个意思,答了字典树这个结构)-&nbsp;使用字典树存储的话空间复杂度是多少(同前面,给出计算思路就行,不需要具体的值)-&nbsp;问了下简历上项目的背景,项目的具体内容没问-&nbsp;项目里的难点/印象深刻的点,咋解决的-&nbsp;针对上一点提了一个发散性的场景题(让你设计个xxx,你的思路)然后反问,无手撕。---春招第一面,被场景设计问题拷打麻了,就当练习了,不敢奢望能过,后续随缘了3.4更新,已挂
_追梦旅人_:大家考虑深圳睿联不,我们正在春招,可在我主页看岗位,感兴趣可直接投递~
查看15道真题和解析
点赞 评论 收藏
分享
评论
7
收藏
分享

创作者周榜

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