Programming Assignment 1: Percolation代码

来源:互联网 发布:苹果笔记本保护壳 知乎 编辑:程序博客网 时间:2024/05/20 09:10

算法第一部分

Algorithms, Part Iby Kevin Wayne, Robert SedgewickPrinceton University

Week1——编程作业1:Percolation 完整代码

Percolation.java

public class Percolation {private boolean[] NN;private int N;private WeightedQuickUnionUF WQUF;private WeightedQuickUnionUF WQUFBack;public Percolation(int N){this.N = N;NN = new boolean[N*N];WQUF = new WeightedQuickUnionUF(N*N + 4);WQUFBack = new WeightedQuickUnionUF(N*N + 1);for(int i=0;i<N;i++){for(int j=0;j<N;j++){NN[i*N+j]=false;}}}public void open(int i,int j){if(i<1 || i>N || j<1 || j>N){throw new java.lang.IndexOutOfBoundsException();}int ii = i - 1;int jj = j - 1;if(NN[ii * N + jj] ){return;}NN[ii * N + jj]=true;//the first lineif(i==1){WQUF.union(ii*N+jj,N*N);WQUFBack.union(ii*N+jj,N*N);}//the last lineif(i==N){WQUF.union(ii*N+jj,N*N+1);}//upif((ii-1)>=0 && NN[(ii-1)*N+jj]){WQUF.union(ii*N+jj,(ii-1)*N+jj);WQUFBack.union(ii*N+jj,(ii-1)*N+jj);}//leftif((jj-1)>=0 && NN[ii*N+(jj-1)]){WQUF.union(ii*N+jj,ii*N+(jj-1));WQUFBack.union(ii*N+jj,ii*N+(jj-1));}//belowif((ii+1)<N && NN[(ii+1)*N+jj]){WQUF.union(ii*N+jj,(ii+1)*N+jj);WQUFBack.union(ii*N+jj,(ii+1)*N+jj);}//rightif((jj+1)<N && NN[ii*N+(jj+1)]){WQUF.union(ii*N+jj,ii*N+(jj+1));WQUFBack.union(ii*N+jj,ii*N+(jj+1));}}public boolean isOpen(int i,int j){if(i<1 || i>N || j<1 || j>N){throw new java.lang.IndexOutOfBoundsException();}return NN[(i-1)*N+(j-1)];}public boolean isFull(int i,int j){if(i<1 || i>N || j<1 || j>N){throw new java.lang.IndexOutOfBoundsException();}return NN[(i-1)*N+(j-1)] && WQUFBack.connected((i-1)*N+(j-1),N*N);}public boolean percolates(){return WQUF.connected(N*N,N*N+1);}}


 

PercolationStats .java

 

public class PercolationStats {private double mean;private double stddev;private double confLow;private double confUp;public PercolationStats(int N,int T){if(N <= 0 || T <= 0){throw new java.lang.IllegalArgumentException();}double times[] = new double[T];for(int t=0;t<T;t++){Percolation perc = new Percolation(N);for(int a=0;a<N*N;a++){int pt = (int) (Math.random() * N * N);int i = pt / N + 1;int j = pt % N + 1;while(perc.isOpen(i, j)){pt = (int) (Math.random() * N * N);i = pt / N + 1;j = pt % N + 1;}perc.open(i, j);if(perc.percolates()){times[t] = ((double) a) / (N *N);break;}}}for (int t = 0; t < T; t++)mean += times[t];mean /= T;for (int t = 0; t < T; t++)stddev += (times[t] - mean) * (times[t] - mean);stddev /= (T - 1);stddev = Math.sqrt(stddev);confLow = mean - 1.96 * stddev / Math.sqrt((double)T);confUp = mean + 1.96 * stddev / Math.sqrt((double)T);}public double mean(){return mean;}public double stddev(){return stddev;}public double confidenceLo(){return confLow;}public double confidenceHi(){return confUp;}public static void main(String[] args){int N = StdIn.readInt();int T = StdIn.readInt();PercolationStats pers = new PercolationStats(N,T);StdOut.println("mean=" + pers.mean());StdOut.println("stddev=" + pers.stddev());StdOut.println("95% confidence interval=" + pers.confidenceLo() + ", " + pers.confidenceHi());}}



 

 

0 0
原创粉丝点击