You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
2.7 KiB
95 lines
2.7 KiB
package com.kob.botRunningSystem.utils; |
|
|
|
import java.io.File; |
|
import java.io.FileNotFoundException; |
|
import java.util.ArrayList; |
|
import java.util.List; |
|
import java.util.Scanner; |
|
|
|
public class Bot implements java.util.function.Supplier<Integer>{ |
|
|
|
|
|
@Override |
|
public Integer get() { |
|
File file = new File("input.txt"); |
|
try { |
|
Scanner sc = new Scanner(file); |
|
return nextMove(sc.next()); |
|
} catch (FileNotFoundException e) { |
|
throw new RuntimeException(e); |
|
} |
|
} |
|
|
|
static class Cell{ |
|
public int x,y; |
|
public Cell(int x,int y) { |
|
this.x = x; |
|
this.y = y; |
|
} |
|
} |
|
|
|
private boolean check_tail_increasing(int steps) { |
|
if (steps <= 10) { |
|
return true; |
|
} |
|
if (steps % 3 == 1) { |
|
return true; |
|
} |
|
return false; |
|
} |
|
|
|
public List<Cell> getCells(int sx,int sy,String steps) { |
|
steps = steps.substring(1,steps.length() - 1); // 去掉编码时加的'()' |
|
List<Cell> res = new ArrayList<>(); |
|
|
|
int []dx = {-1,0,1,0}, dy = {0,1,0,-1}; |
|
int x = sx, y = sy; |
|
int step = 0; |
|
res.add(new Cell(x,y)); |
|
for (int i = 0; i < steps.length(); i++) { |
|
int d = steps.charAt(i) - '0'; |
|
x += dx[d]; |
|
y += dy[d]; |
|
res.add(new Cell(x,y)); |
|
step++; |
|
if (!check_tail_increasing(step)) { |
|
res.remove(0); |
|
} |
|
} |
|
return res; |
|
} |
|
|
|
public Integer nextMove(String input) { |
|
String[] strs = input.split("#"); |
|
int [][] g = new int[13][14]; |
|
for (int i = 0,k = 0; i < 13; i++) { |
|
for (int j = 0; j < 14; j++,k++) { |
|
if (strs[0].charAt(k) == '1') |
|
g[i][j] = 1; |
|
} |
|
} |
|
|
|
int aSx = Integer.parseInt(strs[1]), aSy = Integer.parseInt(strs[2]); |
|
int bSx = Integer.parseInt(strs[4]), bSy = Integer.parseInt(strs[5]); |
|
|
|
// 蛇的身体标记为1 |
|
List<Cell> cellsA = getCells(aSx,aSy,strs[3]); |
|
List<Cell> cellsB = getCells(bSx,bSy,strs[6]); |
|
|
|
|
|
for (Cell c: cellsA) g[c.x][c.y] = 1; |
|
for (Cell c: cellsB) g[c.x][c.y] = 1; |
|
|
|
int[] dx = {-1,0,1,0}; |
|
int[] dy = {0,1,0,-1}; |
|
for (int i = 0; i < 4; i++) { |
|
// 蛇尾坐标,cellsA表示自己的那条蛇 |
|
int x = cellsA.get(cellsA.size() - 1).x + dx[i]; |
|
int y = cellsA.get(cellsA.size() - 1).y + dy[i]; |
|
if (x >= 0 && x < 13 && y >= 0 && y < 14 && g[x][y] == 0) { |
|
return i; // 可以走的位置 |
|
} |
|
} |
|
return 0; // 向上走 |
|
} |
|
}
|
|
|