测评题答案(当时没写出来时间不够有点遗憾)

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
    	Scanner s = new Scanner(System.in);
    	int x = s.nextInt();
    	int[][] temp = new int[x+1][x+1];
    	int[] atemp =new  int [x+1];
    	int[] btemp =new  int [x+1];
    	atemp[0] = 0;
    	btemp[0] = 0;
    	for(int i =0;i<x;i++){
    		Scanner s2 = new Scanner(System.in);
    		String str = s2.nextLine();
    		atemp[i+1]=Integer.parseInt(str.substring(0, 1));
    		btemp[i+1]=Integer.parseInt(str.substring(2, 3));
    	}
    	for (int i = 0; i <= x; i++) {
    		for (int j = 0; j <= x; j++) {
    			int a = (atemp[i]-atemp[j])>=0?(atemp[i]-atemp[j]):-(atemp[i]-atemp[j]);
    			int b = (btemp[i]-btemp[j])>=0?(btemp[i]-btemp[j]):-(btemp[i]-btemp[j]);
    			temp[i][j]=a+b;
    		}		
		}
        TSP problem=new TSP(temp);
        System.out.println(problem.bestCost);
        
    }
}

class TSP{
    int vexnum=0;//顶点数目
    int adjMatrix[][];
    TSP(int[][] adjMat){
        adjMatrix=adjMat;
        vexnum=adjMatrix.length;
        int init[]={0};
        Backtrack(1,init);
        int a;
        a=0;
    }
    int bestCost=0;
    int[] bestX;//最优解向量
    boolean isTraverseDeep=false;
    void Backtrack(int t,int[] x){
        if(t>=vexnum){
            x[t]=0;
            constraint(x,t);
            
        }else{
            int i,j;
            int cx[]=new int[vexnum+1];
            for(j=0;j<t;j++) cx[j]=x[j];
            cx[t]=t;
            if(constraint(cx,t)) Backtrack(t+1,cx);
          
            for(i=1;i<t;i++){
                cx=new int[vexnum+1];
                for(j=0;j<t;j++) cx[j]=x[j];
                cx[t]=t;
                swap(cx,i,t);
                if(constraint(cx,t)) Backtrack(t+1,cx);
            }
        }
    }
    boolean constraint(int[] x,int len){
        int cost=0;
        int i;
        int pre=x[0];
        for(i=1;i<=len;i++){
            int dist=adjMatrix[pre][x[i]];
            if(dist<=0) return false;
            cost+=dist;
            pre=x[i];
        }
        if(isTraverseDeep){
            if(cost<bestCost){
                if(len==vexnum){
                    bestCost=cost;
                    bestX=x;
                }
                return true;
            }else return false;
        }else if(len==vexnum){
            bestCost=cost;
            bestX=x;
            isTraverseDeep=true;
            return true;
        }
        return true;
    }
    private void swap(int[] nums,int a,int b){
        int tmp=nums[a];
        nums[a]=nums[b];
        nums[b]=tmp;
    }
}

哪一个公司的就不合适说了,用了回溯法。

猜你喜欢

转载自blog.csdn.net/Soul_wh/article/details/81251984