题目描述:
在一个 8x8 的棋盘上,放置着若干「黑皇后」和一个「白国王」。
「黑皇后」在棋盘上的位置分布用整数坐标数组 queens 表示,「白国王」的坐标用数组 king 表示。
「黑皇后」的行棋规定是:横、直、斜都可以走,步数不受限制,但是,不能越子行棋。
请你返回可以直接攻击到「白国王」的所有「黑皇后」的坐标(任意顺序)。
提示:
1 <= queens.length <= 63
queens[0].length == 2
0 <= queens[i][j] < 8
king.length == 2
0 <= king[0], king[1] < 8
一个棋盘格上最多只能放置一枚棋子。
傻瓜式编程,逆向,从king找queens
class Solution {
public List<List<Integer>> queensAttacktheKing(int[][] queens, int[] king) {
// 转成king攻击queens
int row = queens.length;
int col = queens[0].length;
int x = king[0];
int y = king[1];
List<List<Integer>> result = new ArrayList<>();
Set<String> set = new HashSet<>();
for (int i = 0; i < queens.length; i++) {
int[] queen = queens[i];
set.add(queen[0] + " " + queen[1]);
}
boolean [][] visited = new boolean[8][8];
get(visited,set,x,y,result);
return result;
}
public void get(boolean visited[][],Set<String>set,int x,int y,List<List<Integer>> list){
// 上下左右攻击
int tem = x;
// 上
while (tem >= 0){
if(set.contains(tem + " " + y)){
if(!visited[tem][y]){
ArrayList<Integer> listtem = new ArrayList<>();
listtem.add(tem);
listtem.add(y);
list.add(listtem);
visited[tem][y] = true;
}
break;
}
tem --;
}
tem = x;
// 上
while (tem < 8){
if(set.contains(tem + " " + y)){
if(!visited[tem][y]){
ArrayList<Integer> listtem = new ArrayList<>();
listtem.add(tem);
listtem.add(y);
list.add(listtem);
visited[tem][y] = true;
}
break;
}
tem ++;
}
tem = y;
// 右
while (tem < 8){
if(set.contains(x + " " + tem)){
if(!visited[x][tem]){
ArrayList<Integer> listtem = new ArrayList<>();
listtem.add(x);
listtem.add(tem);
list.add(listtem);
visited[x][tem] = true;
}
break;
}
tem ++;
}
tem = y;
// 右
while (tem >= 0 ){
if(set.contains(x + " " + tem)){
if(!visited[x][tem]){
ArrayList<Integer> listtem = new ArrayList<>();
listtem.add(x);
listtem.add(tem);
list.add(listtem);
visited[x][tem] = true;
}
break;
}
tem --;
}
int temx = x;
int temy = y;
while (temx >= 0 && temy >= 0){
if(set.contains(temx + " " + temy)){
if(!visited[temx][temy]){
ArrayList<Integer> listtem = new ArrayList<>();
listtem.add(temx);
listtem.add(temy);
list.add(listtem);
visited[temx][temy] = true;
}
break;
}
temx --;
temy --;
}
temx = x;
temy = y;
while (temx <= 7 && temy <= 7){
if(set.contains(temx + " " + temy)){
if(!visited[temx][temy]){
ArrayList<Integer> listtem = new ArrayList<>();
listtem.add(temx);
listtem.add(temy);
list.add(listtem);
visited[temx][temy] = true;
}
break;
}
temx ++;
temy ++;
}
temx = x;
temy = y;
while (temx >= 0 && temy <= 7){
if(set.contains(temx + " " + temy)){
if(!visited[temx][temy]){
ArrayList<Integer> listtem = new ArrayList<>();
listtem.add(temx);
listtem.add(temy);
list.add(listtem);
visited[temx][temy] = true;
}
break;
}
temx --;
temy ++;
}
temx = x;
temy = y;
while (temx <= 7 && temy >= 0){
if(set.contains(temx + " " + temy)){
if(!visited[temx][temy]){
ArrayList<Integer> listtem = new ArrayList<>();
listtem.add(temx);
listtem.add(temy);
list.add(listtem);
visited[temx][temy] = true;
}
break;
}
temx ++;
temy --;
}
}
}
别人实现的代码:
class Solution {
public List<List<Integer>> queensAttacktheKing(int[][] queens, int[] king) {
int [][] p = new int[8][8];
List<List<Integer>> ans = new ArrayList<>();
int[] tx = {-1,-1,-1,0,0,1,1,1};
int[] ty = {-1,0,1,-1,1,-1,0,1};
boolean[] flag = new boolean[8];
for (int i=0;i<queens.length;i++){
p[queens[i][0]][queens[i][1]] = 1;
}
if (p[king[0]][king[1]] == 1){
List<Integer> pos = new ArrayList<>();
pos.add(king[0]);pos.add(king[1]);
ans.add(pos);
return ans;
}
int x = king[0];
int y = king[1];
for (int k=1;k<=8;k++){
for (int t = 0;t<8;t++){
int nowX = x+tx[t] * k;
int nowY = y+ty[t] * k;
if ((nowX>=0) && (nowX<8) &&(nowY>=0) && (nowY<8) && (!flag[t])){
if (p[nowX][nowY] == 1){
List<Integer> pos = new ArrayList<>();
pos.add(nowX);pos.add(nowY);
ans.add(pos);
flag[t] = true;
}
}
}
}
return ans;
}
}