仙化之人
- UID
- 378024
- 积分
- 43936
- 可用积分
- 点
- 威望
- 个
- 水滴
- 滴
- 存在感
- 点
- NB
- 点
- 豆币
- 点
- 帖子
- 主题
- 好友
- 精华
- APP积分
- 点
|
一怒之下 打开我心爱的Netbeans
- package com.ronzhang.test;
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.HashSet;
- import java.util.LinkedList;
- import java.util.List;
- import java.util.Set;
- import java.util.stream.IntStream;
- /**
- *
- * @author zrs
- */
- public class HRD {
- byte[][] zone;
- byte[][] comparing;
- HRD prior;
- // 1 is the biggest
- // 2, 3, 4, 5 is the ve
- // 6 is the hor
- // 7, 8, 9, 10 is the singal
- // 0 is nothing that can move
- public HRD() {
- zone = new byte[][]{
- {2, 1, 1, 3},
- {2, 1, 1, 3},
- {4, 6, 6, 5},
- {4, 8, 9, 5},
- {10, 0, 0, 7}
- };
- comparing = new byte[5][4];
- refreshCompare();
- }
- public HRD(HRD another) {
- zone = new byte[5][4];
- comparing = new byte[5][4];
- for (int i = 0; i < 5; i++) {
- for (int j = 0; j < 4; j++) {
- zone[i][j] = another.zone[i][j];
- }
- }
- refreshCompare();
- prior = another;
- }
- private void refreshCompare() {
- for (int i = 0; i < 5; i++) {
- for (int j = 0; j < 4; j++) {
- switch (zone[i][j]) {
- case 0:
- case 1:
- comparing[i][j] = zone[i][j];
- break;
- case 2:
- case 3:
- case 4:
- case 5:
- comparing[i][j] = 2;
- break;
- case 6:
- comparing[i][j] = 3;
- break;
- case 7:
- case 8:
- case 9:
- case 10:
- comparing[i][j] = 4;
- break;
- }
- }
- }
- }
- @Override
- public int hashCode() {
- int hash = 7;
- hash = 59 * hash + Arrays.deepHashCode(this.comparing);
- return hash;
- }
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj == null) {
- return false;
- }
- if (getClass() != obj.getClass()) {
- return false;
- }
- final HRD other = (HRD) obj;
- if (!Arrays.deepEquals(this.comparing, other.comparing)) {
- return false;
- }
- return true;
- }
- enum Dir {
- up, left, right, down
- }
- int[][] dirs = {
- {0, 1}, {0, -1}, {-1, 0}, {1, 0}
- };
- public List<HRD> move() {
- List<HRD> news = new ArrayList<>();
- HRD newOne = new HRD(this);
- for (int i = 0; i < 5; i++) {
- for (int j = 0; j < 4; j++) {
- if (zone[i][j] == 0) {
- for (Dir dir : Dir.values()) {
- switch (dir) {
- case up:
- if (canMove(i + 1, j, dir, newOne)) {
- news.add(newOne);
- newOne = new HRD(this);
- }
- break;
- case down:
- if (canMove(i - 1, j, dir, newOne)) {
- news.add(newOne);
- newOne = new HRD(this);
- }
- break;
- case left:
- if (canMove(i, j + 1, dir, newOne)) {
- news.add(newOne);
- newOne = new HRD(this);
- }
- break;
- case right:
- if (canMove(i, j - 1, dir, newOne)) {
- news.add(newOne);
- newOne = new HRD(this);
- }
- break;
- default:
- throw new IllegalStateException("bad dir " + dir);
- }
- }
- }
- }
- }
- return news;
- }
- boolean checkRange(int i, int j) {
- return i >= 0 && i < 5 && j >= 0 && j < 4;
- }
- byte block(int i, int j) {
- if (checkRange(i, j)) {
- return zone[i][j];
- } else {
- return -1;
- }
- }
- boolean canMove(int bi, int bj, Dir dir, HRD hrd) {
- byte block = block(bi, bj);
- // System.out.println("(" + bi + ", " + bj + ") = " + Integer.toHexString(block));
- if (block < 0) {
- return false;
- }
- int top, bottom, left, right;
- switch (block) {
- case 0:
- return false;
- case 1:
- // 1, 1
- // 1, 1
- if (block(bi - 1, bj - 1) == block) {
- // checking is bottom right
- top = bi - 1;
- bottom = bi;
- left = bj - 1;
- right = bj;
- } else if (block(bi + 1, bj + 1) == block) {
- // self is top left
- top = bi;
- bottom = bi + 1;
- left = bj;
- right = bj + 1;
- } else if (block(bi - 1, bj + 1) == block) {
- // self is bottom left
- top = bi - 1;
- bottom = bi;
- left = bj;
- right = bj + 1;
- } else {
- // self is top right
- top = bi;
- bottom = bi + 1;
- left = bj - 1;
- right = bj;
- }
- break;
- case 2:
- case 3:
- case 4:
- case 5:
- // 2,
- // 2
- if (block(bi - 1, bj) == block) {
- top = bi - 1;
- bottom = bi;
- left = right = bj;
- } else {
- top = bi;
- bottom = bi + 1;
- left = right = bj;
- }
- break;
- case 6:
- if (block(bi, bj - 1) == block) {
- top = bottom = bi;
- left = bj - 1;
- right = bj;
- } else {
- top = bottom = bi;
- left = bj;
- right = bj + 1;
- }
- break;
- case 7:
- case 8:
- case 9:
- case 10:
- top = bottom = bi;
- left = right = bj;
- break;
- default:
- throw new IllegalStateException("bad block number " + block);
- }
- // System.out.println("top = " + top + ", bottom = " + bottom + ", left = " + left + ", right = " + right + ", dir = " + dir);
- boolean canMove;
- switch (dir) {
- case up:
- canMove = IntStream.rangeClosed(left, right).allMatch(j -> block(top - 1, j) == 0);
- break;
- case down:
- canMove = IntStream.rangeClosed(left, right).allMatch(j -> block(bottom + 1, j) == 0);
- break;
- case left:
- canMove = IntStream.rangeClosed(top, bottom).allMatch(i -> block(i, left - 1) == 0);
- break;
- case right:
- canMove = IntStream.rangeClosed(top, bottom).allMatch(i -> block(i, right + 1) == 0);
- break;
- default:
- throw new IllegalStateException("unknown dir " + dir);
- }
- if (canMove) {
- hrd.doMove(top, left, right, bottom, block, dir);
- }
- return canMove;
- }
- void doMove(
- int top, int left,
- int right, int bottom,
- byte block, Dir dir) {
- switch (dir) {
- case up:
- for (int j = left; j <= right; j++) {
- zone[top - 1][j] = block;
- zone[bottom][j] = 0;
- }
- break;
- case down:
- for (int j = left; j <= right; j++) {
- zone[bottom + 1][j] = block;
- zone[top][j] = 0;
- }
- break;
- case left:
- for (int i = top; i <= bottom; i++) {
- zone[i][left - 1] = block;
- zone[i][right] = 0;
- }
- break;
- case right:
- for (int i = top; i <= bottom; i++) {
- zone[i][right + 1] = block;
- zone[i][left] = 0;
- }
- break;
- default:
- throw new IllegalStateException("unknown dir " + dir);
- }
- refreshCompare();
- }
- @Override
- public String toString() {
- StringBuilder sb = new StringBuilder();
- for (int i = 0; i < 5; i++) {
- for (int j = 0; j < 4; j++) {
- sb.append(Integer.toHexString(zone[i][j]));
- sb.append(" ");
- }
- sb.append("|");
- for (int j = 0; j < 4; j++) {
- sb.append(Integer.toHexString(comparing[i][j]));
- sb.append(" ");
- }
- sb.append("\n");
- }
- return sb.toString();
- }
- public static void main(String[] args) {
- Set<HRD> hashSet = new HashSet<>();
- LinkedList<HRD> queue = new LinkedList<>();
- HRD start = new HRD();
- hashSet.add(start);
- queue.add(start);
- System.out.println(start);
- // hrd.zone[0][0] = 0;
- // System.out.println(hrd.equals(new HRD()));
- // if(true) return;
- while (!queue.isEmpty()) {
- int size = queue.size();
- for (int i = 0; i < size; i++) {
- HRD current = queue.remove();
- List<HRD> moves = current.move();
- for (HRD move : moves) {
- if (move.zone[4][1] == 1 && move.zone[4][2] == 1) {
- System.out.println("------- got it = ------------\n" + move);
- HRD p = move;
- int step = 0;
- while (true) {
- step++;
- System.out.println("-----step " + step + "----");
- System.out.println(p);
- if (p.prior == null) {
- break;
- } else {
- p = p.prior;
- }
- }
- return;
- }
- // System.out.println("------- move = ------------\n" + move);
- if (hashSet.contains(move)) {
- } else {
- // System.out.println("move = ------------\n" + move);
- hashSet.add(move);
- queue.add(move);
- }
- }
- }
- System.out.println("queue.size = " + queue.size());
- System.out.println("hashSet.size = " + hashSet.size());
- }
- System.out.println(hashSet.size());
- }
- }
复制代码
答案:
告辞
|
|