算法——1222、可以攻击国王的皇后

这道题说皇后可以横着走,斜着走,而且只有中间没有子的皇后才能攻击到国王,所以可以建立一个
8 * 8 的矩阵用来当棋盘,第一步先将所有的皇后转化成棋盘上的一个点,然后从国王的位置向
东、南、西、北、东北、东南、西北、西南扩散,找到第一个皇后存到 target 里面,然后后面的皇
后就置之不理,由此得到的 target 就是能攻击到国王的第一个子了。

class Solution {
public:
    void Get(vector<vector<int>>& queens, int i, int j, int n, int a[8][8])
    {
    	// 下面的每一块都代表着一个搜寻的方位
        int temp_i = i, temp_j = j;
        for(; temp_i < n; ++temp_i)
        {
            if(a[temp_i][temp_j] == 1)
            {
                vector<int> _a;
                _a.push_back(temp_i);
                _a.push_back(temp_j);
                queens.push_back(_a);
                break;
            }
        }
        temp_i = i;
        for(; temp_i >= 0; --temp_i)
        {
            if(a[temp_i][temp_j] == 1)
            {
                vector<int> _a;
                _a.push_back(temp_i);
                _a.push_back(temp_j);
                queens.push_back(_a);
                break;
            }
        }
        temp_i = i;
        for(; temp_j < n; ++temp_j)
        {
            if(a[temp_i][temp_j] == 1)
            {
                vector<int> _a;
                _a.push_back(temp_i);
                _a.push_back(temp_j);
                queens.push_back(_a);
                break;
            }
        }
        temp_j = j;
        for(; temp_j >= 0; --temp_j)
        {
            if(a[temp_i][temp_j] == 1)
            {
                vector<int> _a;
                _a.push_back(temp_i);
                _a.push_back(temp_j);
                queens.push_back(_a);
                break;
            }
        }


        temp_i = i;
        temp_j = j;
        for(; temp_j < n && temp_i < n; ++temp_j, ++temp_i)
        {
            if(a[temp_i][temp_j] == 1)
            {
                vector<int> _a;
                _a.push_back(temp_i);
                _a.push_back(temp_j);
                queens.push_back(_a);
                break;
            }
        }
        temp_i = i;
        temp_j = j;
        for(; temp_j >= 0 && temp_i >= 0; --temp_j, --temp_i)
        {
            if(a[temp_i][temp_j] == 1)
            {
                vector<int> _a;
                _a.push_back(temp_i);
                _a.push_back(temp_j);
                queens.push_back(_a);
                break;
            }
        }
        temp_i = i;
        temp_j = j;
        for(; temp_j >= 0 && temp_i < n; --temp_j, ++temp_i)
        {
            if(a[temp_i][temp_j] == 1)
            {
                vector<int> _a;
                _a.push_back(temp_i);
                _a.push_back(temp_j);
                queens.push_back(_a);
                break;
            }
        }
        temp_i = i;
        temp_j = j;
        for(; temp_j < n && temp_i >= 0; ++temp_j, --temp_i)
        {
            if(a[temp_i][temp_j] == 1)
            {
                vector<int> _a;
                _a.push_back(temp_i);
                _a.push_back(temp_j);
                queens.push_back(_a);
                break;
            }
        }
    }

    vector<vector<int>> queensAttacktheKing(vector<vector<int>>& queens, vector<int>& king) {
        int n = queens.size(), a[8][8] = {0};
        vector<vector<int>> target;
        for(int i = 0; i < n; ++i)
        {
            a[queens[i][0]][queens[i][1]] = 1;
        }
        n = 8;
        Get(target, king[0], king[1], n, a);

        return target;
    }
};

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值