关注
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);
}
}
}
查看原帖
点赞 评论
相关推荐
点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客热帖
更多
- 1... 6月18日,我将站上法庭,正式起诉美团。我送出的每一单快件,都是我人生碎片的一部分。我会一直前进,拿回在海外SaaS失去的一切。4.8W
- 2... 研一快手后端开发,一周速通,附一二面面经1.0W
- 3... 25校招 双非硕 拿下大厂🐧9838
- 4... 毕业一年在回到学校的感觉真不一样8768
- 5... 挚文集团-陌陌笔试202506068126
- 6... 主包租房的经验总结!5336
- 7... 深入浅出秋招简历3886
- 8... 金山办公测试春招一面_珠海3874
- 9... 上海银行 修改入职协议 不还本科毕业证学位证双证原件 😂3793
- 10... 一个双非实习生的大学经历和成长3148
正在热议
更多
# 我的实习收获 #
35145次浏览 529人参与
# 安利/避雷我的专业 #
73671次浏览 515人参与
# 实习吐槽大会 #
39053次浏览 182人参与
# 我在牛爱网找对象 #
186470次浏览 1402人参与
# 晒一晒你的工位 #
87370次浏览 310人参与
# 你后悔选择现在的专业吗 #
81955次浏览 672人参与
# 你觉得专业和学校哪个对薪资影响最大 #
58191次浏览 473人参与
# 求职遇到的搞笑事件 #
113683次浏览 772人参与
# 移动求职进展汇总 #
1706次浏览 17人参与
# 2025牛客秋招季 #
6483次浏览 199人参与
# 机械人与华为的爱恨情仇 #
113413次浏览 938人参与
# 双非能在秋招上岸吗? #
215540次浏览 1150人参与
# 我的租房踩坑经历 #
34247次浏览 338人参与
# 第一份工作应该选高薪还是热爱? #
61768次浏览 562人参与
# 26届秋招投递记录 #
5006次浏览 133人参与
# 我的国央企投递进展 #
43157次浏览 268人参与
# 穿越回高考你还会选现在的专业吗 #
25122次浏览 285人参与
# 牛友们,签完三方你在忙什么? #
95218次浏览 842人参与
# 地方国企笔面经互助 #
30028次浏览 99人参与
# 招银网络求职进展汇总 #
113417次浏览 742人参与