这道题说皇后可以横着走,斜着走,而且只有中间没有子的皇后才能攻击到国王,所以可以建立一个
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;
}
};