隐式图搜索问题源代码

隐式图搜索问题

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<EightPuzzle> shortpath = new ArrayList<EightPuzzle>();
    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);
            }
        }
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值