数据结构课程实践(2)-代码补充

数据结构实践(2)-代码补充

----运用open ,close表来存储存入和取出的数据

1.结点类

public class Node {
    private int[][]nowState;
    private int f;//价值
    private int h;//层数
    private Node parent;
    public Node(int [][]nowState ,int h,Node parent){
        this.nowState=nowState;
        this.h=h;
        this.parent=parent;
    }

    public int getF() {
        return f;
    }

    public void setF(int g) {
        this.f=g+h;
    }

    public int[][] getNowState() {
        return nowState;
    }

    public void setNowState(int[][] nowState) {
        this.nowState = nowState;
    }

    public Node getParent() {
        return parent;
    }

    public void setParent(Node parent) {
        this.parent = parent;
    }

    public int getH() {
        return h;
    }

    public void setH(int h) {
        this.h = h;
    }
}

2.主要操作类

import java.util.ArrayList;
import java.util.List;

public class Mape {
    private Node start;
    private Node target;
    private List<Node> open=new ArrayList<>();
    private List<Node>close=new ArrayList<>();
    int x,y;//存空格位置
    public Mape(int [][]start,int[][]target){
        this.start=new Node(start,0,null);
        this.target=new Node(target,0,null);
    }
    public int diffNum(Node p,Node q){
        int num=0;
        for(int i=0;i<p.getNowState().length;i++){
            for(int j=0;j<p.getNowState()[i].length;j++){
                if(p.getNowState()[i][j]!=q.getNowState()[i][j])
                    num++;
            }
        }
        return num;
    }
    public boolean isEqual(Node p,Node q){
        for(int i=0;i<p.getNowState().length;i++){
            for(int j=0;j<p.getNowState()[i].length;j++){
                if(p.getNowState()[i][j]!=q.getNowState()[i][j])
                    return false;
            }
        }
        return true;
    }
    public void findBlank(Node p){
        for(int i=0;i<p.getNowState().length;i++){
            for(int j=0;j<p.getNowState()[i].length;j++){
                if(p.getNowState()[i][j]==0){
                    x=i;y=j;
                }
            }
        }
    }
    public boolean isExist(Node p){
        for(int i=0;i<close.size();i++){
            if(isEqual(p,close.get(i)))
                return true;
        }
        return false;
    }
    public void addState(Node p){
        Node q;
        int [][]a;
        //对上移操作
        a=new int[3][3];
        for(int i=0;i<p.getNowState().length;i++){
            for(int j=0;j<p.getNowState()[i].length;j++){
                a[i][j]=p.getNowState()[i][j];
            }
        }
        findBlank(p);
        if(x-1>=0){
            int tmp=a[x][y];
            a[x][y]=a[x-1][y];
            a[x-1][y]=tmp;
            q=new Node(a,p.getH()+1,p);
            if(!isExist(q)){
                q.setF(diffNum(q,target));
                open.add(q);
            }
        }
        //对下移操作
        a=new int[3][3];
        for(int i=0;i<p.getNowState().length;i++){
            for(int j=0;j<p.getNowState()[i].length;j++){
                a[i][j]=p.getNowState()[i][j];
            }
        }
        findBlank(p);
        if(x+1<=2){
            int tmp=a[x][y];
            a[x][y]=a[x+1][y];
            a[x+1][y]=tmp;
            q=new Node(a,p.getH()+1,p);
            if(!isExist(q)){
                q.setF(diffNum(q,target));
                open.add(q);
            }
        }
        //对左移操作
        a=new int[3][3];
        for(int i=0;i<p.getNowState().length;i++){
            for(int j=0;j<p.getNowState()[i].length;j++){
                a[i][j]=p.getNowState()[i][j];
            }
        }
        findBlank(p);
        if(y-1>=0){
            int tmp=a[x][y];
            a[x][y]=a[x][y-1];
            a[x][y-1]=tmp;
            q=new Node(a,p.getH()+1,p);
            if(!isExist(q)){
                q.setF(diffNum(q,target));
                open.add(q);
            }
        }
        //对右移操作
        a=new int[3][3];
        for(int i=0;i<p.getNowState().length;i++){
            for(int j=0;j<p.getNowState()[i].length;j++){
                a[i][j]=p.getNowState()[i][j];
            }
        }
        findBlank(p);
        if(y+1<=2){
            int tmp=a[x][y];
            a[x][y]=a[x][y+1];
            a[x][y+1]=tmp;
            q=new Node(a,p.getH()+1,p);
            if(!isExist(q)){
                q.setF(diffNum(q,target));
                open.add(q);
            }
        }
    }
    public void sort(){
        Node node;
        int left=0,right=open.size()-1;
        while(left<right)
        {
            for(int i=left+1;i<=right;i++){
                if(open.get(left).getF()>open.get(i).getF()){
                    node=open.get(i);
                    open.set(i,open.get(left));
                    open.set(left,node);
                }
            }
            left++;
            for(int i=right-1;i>=left;i--){
                if(open.get(right).getF()<open.get(i).getF()){
                    node=open.get(i);
                    open.set(i,open.get(right));
                    open.set(right,node);
                }
            }
            right--;
        }
    }
    public void aStar(){
        open.add(start);
        Node p=null;
        while(open!=null){
            p=open.get(0);
            if(isEqual(p,target))
                break;
            open.remove(0);
            close.add(p);
            addState(p);
            sort();
        }
        if(isEqual(p,target)){
            List<Node>answer=new ArrayList<>();
            while(p.getParent()!=null){
                answer.add(p);
                p=p.getParent();
            }
            System.out.println("运行步骤:");
            for(int i=answer.size()-1;i>=0;i--){
                System.out.println(answer.size()-i+":");
                show(answer.get(i));
            }
        }
    }
    public void show(Node p){
        for(int i=0;i<p.getNowState().length;i++){
            for(int j=0;j<p.getNowState()[i].length;j++){
                System.out.print(p.getNowState()[i][j]+" ");
            }
            System.out.println();
        }
    }
}

3.Main类

import java.util.Scanner;

public class Main {
    public static void main(String[]args){
        Scanner scanner=new Scanner(System.in);
        System.out.println("起始位置:");
        int [][]origin=new int[3][3];
        int [][]purpose=new int[3][3];
        for(int i=0;i<3;i++)
            for(int j=0;j<3;j++)
                origin[i][j]=scanner.nextInt();
        System.out.println("目标位置:");
        for(int i=0;i<3;i++)
            for (int j = 0; j < 3; j++)
                purpose[i][j]=scanner.nextInt();

            Mape mape=new Mape(origin,purpose);
            mape.aStar();
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nightelves11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值