隐藏式图的搜索问题(代码实现)

隐藏式图的搜索问题——代码实现

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;

public class EightPuzzle implements Comparable {
private int[] nine = new int[9];
private int f;
private int g;
private int h;
private EightPuzzle parent;
private ArrayList shortpath = new ArrayList();
public int[] getNine() {
return nine;
}
public void setNine(int[] nine) {
this.nine = nine;
}
public int getG() {
return g;
}
public void setG(int g) {
this.g= g;
}
public int getF() {
return f;
}
public void setF(int evaluation) {
this.f = evaluation;
}
public int getH() {
return h;
}
public void setH(int h) {
this.h = h;
}
public EightPuzzle getParent() {
return parent;
}
public void setParent(EightPuzzle parent) {
this.parent = parent;
}

public boolean isTarget(EightPuzzle target){
    return Arrays.equals(getNine(), target.getNine());
}


public void celF(EightPuzzle target){
    int temp = 0;
    for(int i=0;i<9;i++){
        if(nine[i]!=target.getNine()[i])
            temp++;
    }
    this.setH(temp);
    if(this.getParent()==null){
        this.setG(0);
    }else{
        this.g = this.parent.getG()+1;
    }
    this.setF(this.getG()+this.getH());
}



public boolean isSolvable(EightPuzzle target){
    int reverse = 0;
    for(int i=0;i<9;i++){
        for(int j=0;j<i;j++){//遇到0跳过
            if(nine[j]>nine[i] && nine[j]!=0 && nine[i]!= 0)
                reverse++;
            if(target.getNine()[j]>target.getNine()[i] && target.getNine()[j]!=0 && target.getNine()[i]!=0)
                reverse++;
        }
    }
    if(reverse % 2 == 0)
        return true;
    return false;
}



public int compareTo(Object o) {
    EightPuzzle c = (EightPuzzle) o;
    return this.f-c.getF();
}

public int getZeroPosition(){
    int position = -1;
    for(int i=0;i<9;i++){
        if(this.nine[i] == 0){
            position = i;
        }
    }
    return position;
}

public int isContains(ArrayList<EightPuzzle> open){
    for(int i=0; i<open.size(); i++){
        if(Arrays.equals(open.get(i).getNine(), getNine())){
            return i;
        }
    }
    return -1;
}

public boolean isMoveUp() {
    int position = getZeroPosition();
    if(position<=2){
        return false;
    }
    return true;
}

public boolean isMoveDown() {
    int position = getZeroPosition();
    if(position>=6){
        return false;
    }
    return true;
}

public boolean isMoveLeft() {
    int position = getZeroPosition();
    if(position%3 == 0){
        return false;
    }
    return true;
}

public boolean isMoveRight() {
    int position = getZeroPosition();
    if((position)%3 == 2){
        return false;
    }
    return true;
}

public EightPuzzle moveUp(int move){
    EightPuzzle temp = new EightPuzzle();
    int[] tempnum = nine.clone();
    temp.setNine(tempnum);
    int position = getZeroPosition();
    int p=0;
    switch(move){
        case 0:
            p = position-3;
            temp.getNine()[position] = nine[p];
            break;
        case 1:
            p = position+3;
            temp.getNine()[position] = nine[p];
            break;
        case 2:
            p = position-1;
            temp.getNine()[position] = nine[p];
            break;
        case 3:
            p = position+1;
            temp.getNine()[position] = nine[p];
            break;
    }
    temp.getNine()[p] = 0;
    return temp;
}

public void print(){
    for(int i=0;i<9;i++){
        if(i%3 == 2){
            System.out.println(this.nine[i]);
        }else{
            System.out.print(this.nine[i]+"  ");
        }
    }
}

public void printRoute(){
    EightPuzzle temp = null;
    int count = 0;
    temp = this;
    System.out.println("----------开始移动----------");
    while(temp!=null){
        shortpath.add(temp);
        temp = temp.getParent();
        count++;
    }
    for(int i=shortpath.size()-2 ; i>=0 ; i--){
        System.out.println("第"+(shortpath.size()-i-1)+"步");
        shortpath.get(i).print();
        System.out.println("--------------------");
    }

}

public void operation(ArrayList<EightPuzzle> open,ArrayList<EightPuzzle> close,EightPuzzle parent,EightPuzzle target){
    if(this.isContains(close) == -1){
        int position = this.isContains(open);
        if(position == -1){
            this.parent = parent;
            this.celF(target);
            open.add(this);
        }else{
            if(this.getG() < open.get(position).getG()){
                open.remove(position);
                this.celF(target);
                open.add(this);
            }
        }
    }
}

public static void main(String args[]) {
    //定义open表
    ArrayList<EightPuzzle> open = new ArrayList<EightPuzzle>();
    ArrayList<EightPuzzle> close = new ArrayList<EightPuzzle>();
    EightPuzzle start = new EightPuzzle();
    EightPuzzle target = new EightPuzzle();
    Scanner s = new Scanner(System.in);
    int startarray[] = new int[9];
    int targetarray[] = new int[9];
    System.out.println("请输入初始状态:");
    for (int i = 0; i < 9; i++) {
        startarray[i] = s.nextInt();
    }
    System.out.println("请输入目标状态:");
    for (int j = 0; j < 9; j++) {
        targetarray[j] = s.nextInt();
    }
    s.close();
    start.setNine(startarray);
    target.setNine(targetarray);
    start.celF(target);
    open.add(start);
    while (open.isEmpty() == false) {
        Collections.sort(open);
        EightPuzzle best = open.get(0);
        open.remove(0);
        close.add(best);
        if (best.isTarget(target)) {
            //输出
            best.printRoute();
        }
        int move;

        if (best.isMoveUp()) {
            move = 0;
            EightPuzzle up = best.moveUp(move);
            up.operation(open, close, best, target);
        }
        if (best.isMoveDown()) {
            move = 1;
            EightPuzzle down = best.moveUp(move);
            down.operation(open, close, best, target);
        }
        if (best.isMoveLeft()) {
            move = 2;
            EightPuzzle left = best.moveUp(move);
            left.operation(open, close, best, target);
        }
        if (best.isMoveRight()) {
            move = 3;
            EightPuzzle right = best.moveUp(move);
            right.operation(open, close, best, target);
        }
    }
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值