用java实现野人传教士过河问题

Python017

用java实现野人传教士过河问题,第1张

//CrossRiverQuestion.java

import java.util.ArrayList

import java.util.List

public class CrossRiverQuestion {

    public static void main(String[] args) {

        CrossRiverQuestion q = new CrossRiverQuestion(5, 4)

        q.solveQuestion()

    }

    private int peoNum

    private int savageNum

    private List<Node> resultList = new ArrayList<Node>()

    public List<Node> solveQuestion() {

        Node n = new Node(peoNum,savageNum,0,0,0,new ArrayList<Integer>(),0,0)

        boolean dfsResult = dfs(n)

        if(dfsResult) {

            resultList.add(0,n)

            for(Node node : resultList) {

                System.out.println("左岸传教士:"+node.getLeftPeo()+"左岸野人: "+node.getLeftSavage()+" 右岸传教士: "+node.getRightPeo()+"右岸野人:"+node.getRightSavage()+"船上传教士:"+node.getOnBoatPeoNum()+"船上野人:"+node.getOnBoatSavageNum())

            }

            return resultList

        }

        return null

    }

    

    public CrossRiverQuestion(int peoNum, int savageNum) {

        super()

        this.peoNum = peoNum

        this.savageNum = savageNum

    }

    private boolean dfs(Node n) {

        if(n.hasVisited()) return false

        n.addCheckSum()

        if(n.getLeftPeo()==0&&n.getLeftSavage()==0) return true

        if(n.getLeftPeo()<0||n.getRightPeo()<0||n.getLeftSavage()<0||n.getRightSavage()<0) {

            return false

        }

        if(n.getLeftPeo()<n.getLeftSavage()&&n.getLeftPeo()>0) return false

        if(n.getRightPeo()<n.getRightSavage()&&n.getRightPeo()>0) return false

        if(n.getCURR_STATE()==n.getStateBoatLeft()) {

            Node n1 = new Node(n.getLeftPeo()-1,n.getLeftSavage()-1,n.getRightPeo()+1,n.getRightSavage()+1,n.getStateBoatRight(),n.getNodesCheckSum(),1,1)

            if(dfs(n1)) {

                resultList.add(0,n1)

                return true

            }

            Node n4 = new Node(n.getLeftPeo()-2,n.getLeftSavage(),n.getRightPeo()+2,n.getRightSavage(),n.getStateBoatRight(),n.getNodesCheckSum(),2,0)

            if(dfs(n4)) {

                resultList.add(0,n4)

                return true

            }

            Node n5 = new Node(n.getLeftPeo(),n.getLeftSavage()-2,n.getRightPeo(),n.getRightSavage()+2,n.getStateBoatRight(),n.getNodesCheckSum(),0,2)

            if(dfs(n5))  {

                resultList.add(0,n5)

                return true

            }

        } 

        else {

            Node n6 = new Node(n.getLeftPeo(),n.getLeftSavage()+1,n.getRightPeo(),n.getRightSavage()-1,n.getStateBoatLeft(),n.getNodesCheckSum(),0,1)

            if(dfs(n6)) {

                resultList.add(0,n6)

                return true

            }

            Node n7 = new Node(n.getLeftPeo()+1,n.getLeftSavage(),n.getRightPeo()-1,n.getRightSavage(),n.getStateBoatLeft(),n.getNodesCheckSum(),1,0)

            if(dfs(n7)) {

                resultList.add(0,n7)

                return true

            }

            Node n1 = new Node(n.getLeftPeo()+1,n.getLeftSavage()+1,n.getRightPeo()-1,n.getRightSavage()-1,n.getStateBoatLeft(),n.getNodesCheckSum(),1,1)

            if(dfs(n1)) {

                resultList.add(0,n1)

                return true

            }

            Node n4 = new Node(n.getLeftPeo()+2,n.getLeftSavage(),n.getRightPeo()-2,n.getRightSavage(),n.getStateBoatLeft(),n.getNodesCheckSum(),2,0)

            if(dfs(n4)) {

                resultList.add(0,n4)

                return true

            }

            Node n5 = new Node(n.getLeftPeo(),n.getLeftSavage()+2,n.getRightPeo(),n.getRightSavage()-2,n.getStateBoatLeft(),n.getNodesCheckSum(),0,2)

            if(dfs(n5))  {

                resultList.add(0,n5)

                return true

            }

        }

        return false

    }

    public List<Node> getResultList() {

        return resultList

    }

    

}

Node.java

import java.util.ArrayList

import java.util.List

public class Node {

    private List<Integer> nodesCheckSum = new ArrayList<Integer>()

    private int leftPeo

    private int rightPeo

    private int leftSavage

    private int rightSavage

    private int CURR_STATE = 0

    private int onBoatPeoNum = 0

    private int onBoatSavageNum = 0

    private final int STATE_BOAT_LEFT = 0

    private final int STATE_BOAT_RIGHT = 1

    public Node(int leftPeo, int leftSavage, int rightPeo, int rightSavage, int state, List checkSumList, int onBoatPeoNum, int onBoatSavageNum) {

        this.CURR_STATE = state

        this.leftPeo = leftPeo

        this.leftSavage = leftSavage

        this.rightPeo = rightPeo

        this.rightSavage = rightSavage

        this.nodesCheckSum.addAll(checkSumList)

        this.onBoatPeoNum = onBoatPeoNum

        this.onBoatSavageNum = onBoatSavageNum

    }

    public int getLeftPeo() {

        return leftPeo

    }

    public void setLeftPeo(int leftPeo) {

        this.leftPeo = leftPeo

    }

    public int getRightPeo() {

        return rightPeo

    }

    public void setRightPeo(int rightPeo) {

        this.rightPeo = rightPeo

    }

    public int getLeftSavage() {

        return leftSavage

    }

    public void setLeftSavage(int leftSavage) {

        this.leftSavage = leftSavage

    }

    public int getRightSavage() {

        return rightSavage

    }

    public void setRightSavage(int rightSavage) {

        this.rightSavage = rightSavage

    }

    @Override

    public String toString() {

        return leftPeo+","+leftSavage+","+rightPeo+","+rightSavage+","+CURR_STATE

    }

    public int getCURR_STATE() {

        return CURR_STATE

    }

    public void setCURR_STATE(int cURR_STATE) {

        CURR_STATE = cURR_STATE

    }

    public int getStateBoatLeft() {

        return STATE_BOAT_LEFT

    }

    public int getStateBoatRight() {

        return STATE_BOAT_RIGHT

    }

    public int calcCheckSum() {

        return 1*getCURR_STATE()+10*getLeftPeo()+100*getLeftSavage()+1000*getRightPeo()+10000*getRightSavage()

    }

    public void addCheckSum() {

        int checkSum = calcCheckSum()

        nodesCheckSum.add(checkSum)

    }

    public boolean hasVisited() {

        int sum = calcCheckSum()

        for (Integer checkSum : nodesCheckSum) {

            if(checkSum==sum) return true

        }

        return false

    }

    public List<Integer> getNodesCheckSum() {

        return nodesCheckSum

    }

    public int getOnBoatPeoNum() {

        return onBoatPeoNum

    }

    public void setOnBoatPeoNum(int onBoatPeoNum) {

        this.onBoatPeoNum = onBoatPeoNum

    }

    public int getOnBoatSavageNum() {

        return onBoatSavageNum

    }

    public void setOnBoatSavageNum(int onBoatSavageNum) {

        this.onBoatSavageNum = onBoatSavageNum

    }

    

}

完全无难度

野人位置(X),河宽长(w)

过河方法:

runrain(x,y){

if(x<=w){

x++

}else(){

x=w//刚过完河位置

}