关注
import java.util.*;
class Position2D {
int x;
int y;
Position2D(int x, int y){
this.x = x;
this.y = y;
}
public boolean equals(Object obj){
return obj instanceof Position2D
&& (((Position2D)obj).x == this.x)
&&(((Position2D)obj).y == this.y);
}
}
class Config {
Position2D horseA;
Position2D horseB;
char[][] record;
int[][] isVisited;
int stepUsed;
Config(Position2D horseA, Position2D horseB, char[][] record, int[][] isVisited, int stepUsed){
this.horseA = horseA;
this.horseB = horseB;
this.record = record;
this.isVisited = isVisited;
this.stepUsed = stepUsed;
}
}
class Main12{
public static void main(String[] args){
char[][] record = {
{'H','*','*','h','*'},
{'*','*','h','*','*'},
{'*','*','H','#','#'},
{'#','#','*','*','*'},
{'*','*','*','*','*'}
};
int[][] isVisited = new int[record.length][record[0].length];
isVisited[0][0] = 1;
isVisited[2][2] = 2;
System.out.println(minimumJumps(new Position2D(0,0),new Position2D(2,2),
new Position2D(3,0),new Position2D(2,1),record,isVisited,0));
}
static boolean isValid(char[][] record, Position2D ori, Position2D dest, Position2D another){
//避免边界
if(dest.x<0||dest.x>=record[0].length||dest.y<0||dest.y>=record.length) return false;
//避免两马重合
if(dest.equals(another)) return false;
//避免障碍物
if(record[dest.y][dest.x] == '#') return false;
//示意图: 蹩马腿情况示意图 共8种情况, 可以是另一只马('H')或者障碍物('#')
// 0 1 2 3 4 5 6 7 8 横坐标
// 1 1 3
// 2 2 4
// 3 m
// 4 5 8
// 5 6 7 //m可以抵达的位置
//纵坐标
//case 2
if(dest.y == ori.y - 1
&& dest.x == ori.x - 2
&& (record[ori.y-1][ori.x-1]=='#'||record[ori.y][ori.x-1]=='#'|| record[ori.y-1][ori.x-1]=='H'||record[ori.y][ori.x-1]=='H'))
return false;
//case 1
if(dest.y == ori.y - 2
&& dest.x == ori.x - 1
&& (record[ori.y-1][ori.x]=='#'||record[ori.y-1][ori.x-1]=='#'|| record[ori.y-1][ori.x]=='H'||record[ori.y-1][ori.x-1]=='H'))
return false;
//case 5
if(dest.y == ori.y + 1
&& dest.x == ori.x - 2
&& (record[ori.y+1][ori.x-1]=='#'||record[ori.y][ori.x-1]=='#'||record[ori.y+1][ori.x-1]=='H'||record[ori.y][ori.x-1]=='H'))
return false;
//case 6
if(dest.y == ori.y + 2
&& dest.x == ori.x - 1
&& (record[ori.y+1][ori.x]=='#'||record[ori.y+1][ori.x-1]=='#'||record[ori.y+1][ori.x]=='H'||record[ori.y+1][ori.x-1]=='H'))
return false;
//case 3
if(dest.y == ori.y - 2
&& dest.x == ori.x + 1
&& (record[ori.y-1][ori.x]=='#'||record[ori.y-1][ori.x+1]=='#'||record[ori.y-1][ori.x]=='H'||record[ori.y-1][ori.x+1]=='H'))
return false;
//case 4
if(dest.y == ori.y - 1
&& dest.x == ori.x + 2
&& (record[ori.y-1][ori.x+1]=='#'||record[ori.y][ori.x+1]=='#'||record[ori.y-1][ori.x+1]=='H'||record[ori.y][ori.x+1]=='H'))
return false;
//case 8
if(dest.y == ori.y + 1
&& dest.x == ori.x + 2
&& (record[ori.y][ori.x+1]=='#'||record[ori.y+1][ori.x+1]=='#'||record[ori.y][ori.x+1]=='H'||record[ori.y+1][ori.x+1]=='H'))
return false;
//case 7
if(dest.y == ori.y + 2
&& dest.x == ori.x + 1
&& (record[ori.y+1][ori.x+1]=='#'||record[ori.y+1][ori.x]=='#'||record[ori.y+1][ori.x+1]=='H'||record[ori.y+1][ori.x]=='H'))
return false;
return true;
}
//可能的移动
static int[][] possibleMove = {{-1,-2},{-2,-1},{1,-2},{2,-1},{-2,1},{-1,2},{1,2},{2,1}};
//BFS Queue
static Queue<Config> queue = new LinkedList<>();
static int minimumJumps(Position2D horseA, Position2D horseB, Position2D d1, Position2D d2, char[][] record, int[][] isVisited, int stepUsed){
queue.offer(new Config(horseA,horseB,record,isVisited,stepUsed));
while(!queue.isEmpty()){
Config current = queue.poll();
for(int[] pm: possibleMove){
horseA = current.horseA;
horseB = current.horseB;
record = current.record;
isVisited = current.isVisited;
stepUsed = current.stepUsed;
Position2D destinationA = new Position2D(horseA.x+pm[0],horseA.y+pm[1]);
if(!horseA.equals(d1)
&&isValid(record,horseA,destinationA,horseB)
&&isVisited[destinationA.y][destinationA.x]!=1&&isVisited[destinationA.y][destinationA.x]!=3){
char[][] newRecord =new char[record.length][record[0].length];
arrayCopy(record,newRecord);
newRecord[horseA.y][horseA.x] = '*';
newRecord[destinationA.y][destinationA.x] = 'H';
int[][] newIsVisited = new int[isVisited.length][isVisited[0].length];
arrayCopy(isVisited,newIsVisited);
newIsVisited[destinationA.y][destinationA.x]++;
if(newRecord[d1.y][d1.x] == 'H'&&newRecord[d2.y][d2.x] == 'H') return stepUsed + 1;
queue.offer(new Config(destinationA,horseB,newRecord,newIsVisited,stepUsed+1));
}
Position2D destinationB = new Position2D(horseB.x+pm[0],horseB.y+pm[1]);
if(!horseB.equals(d2)
&&isValid(record,horseB,destinationB,horseA)&&
isVisited[destinationB.y][destinationB.x]!=2 && isVisited[destinationB.y][destinationB.x]!=3){
char[][] newRecord =new char[record.length][record[0].length];
arrayCopy(record,newRecord);
newRecord[horseB.y][horseB.x] = '*';
newRecord[destinationB.y][destinationB.x] = 'H';
int[][] newIsVisited = new int[isVisited.length][isVisited[0].length];
arrayCopy(isVisited,newIsVisited);
newIsVisited[destinationB.y][destinationB.x]+=2;
if(newRecord[d1.y][d1.x] == 'H'&&newRecord[d2.y][d2.x] == 'H') return stepUsed + 1;
queue.offer(new Config(horseA,destinationB,newRecord,newIsVisited,stepUsed+1));
}
}
}
return stepUsed+1;
}
public static void arrayCopy(int[][] aSource, int[][] aDestination) {
for (int i = 0; i < aSource.length; i++) {
System.arraycopy(aSource[i], 0, aDestination[i], 0, aSource[i].length);
}
}
public static void arrayCopy(char[][] aSource, char[][] aDestination) {
for (int i = 0; i < aSource.length; i++) {
System.arraycopy(aSource[i], 0, aDestination[i], 0, aSource[i].length);
}
}
}
查看原帖
点赞 评论
相关推荐

点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 26届的你,投了哪些公司? #
7235次浏览 108人参与
# 我对___祛魅了 #
15824次浏览 148人参与
# 中兴秋招 #
186599次浏览 2072人参与
# 如何快速融入团队? #
5921次浏览 81人参与
# 你跟室友的关系怎么样? #
1274次浏览 32人参与
# 和同事相处最忌讳的是__ #
8029次浏览 91人参与
# 简历上的经历如何包装 #
6274次浏览 171人参与
# 你遇到最难的面试题目是_ #
2211次浏览 50人参与
# 元戎启行求职进展汇总 #
35299次浏览 268人参与
# 打工人的精神状态 #
65492次浏览 1088人参与
# 我和mentor的爱恨情仇 #
61059次浏览 373人参与
# 工作中哪个瞬间让你想离职 #
38429次浏览 305人参与
# 什么样的背景能拿SSP? #
9560次浏览 83人参与
# 25届如何提前做秋招准备? #
175977次浏览 2493人参与
# 你最讨厌面试问你什么? #
4961次浏览 96人参与
# 毕业季,给职场新人一些建议 #
98078次浏览 1775人参与
# 工作中的卑微时刻 #
20271次浏览 165人参与
# 职场人,说说你的烦心事 #
13171次浏览 110人参与
# 远景求职进展汇总 #
53961次浏览 299人参与
# 职场常用语录大全 #
5724次浏览 42人参与
# 一人推荐一个机械人值得去的公司 #
413916次浏览 4157人参与