注册一亩三分地论坛,查看更多干货!
您需要 登录 才可以下载或查看附件。没有帐号?注册账号 
x
public class Percolation{
private boolean[] status ;
private int size,top,bottom;
private WeightedQuickUnionUF uf;
public Percolation(int N){
if (N<=0){
throw new IllegalArgumentException();
}
uf=new WeightedQuickUnionUF(N*N);
status=new boolean[N*N];
size=N;
for( int i=0;i<N*N;i++){
status[i]=false;
for( i=0;i<N;i++){
uf.union(i,top);
uf.union(N*(N-1)+i,bottom);
}
}
}
private int getIndex(final int i, final int j){
if(i<1||i>size||j<1||j>size){
throw new IndexOutOfBoundsException();
}
final int index=size*(i-1)+(j-1);
return index;
}
public void open (int i,int j){
if(i<1||i>size||j<1||j>size){
throw new IndexOutOfBoundsException();
}
final int index=getIndex(i,j);
if (!status[index]){
status[index]=true;
if(i-2>=0){
int index1=size*(i-2)+(j-1);
if(status[index1]){
uf.union(index,index1);
}
}
if(i+1<=size){
int index2=size*(i)+(j-1);
if(status[index2]){
uf.union(index,index2);
}
}
if(j-2>=0){
int index3=size*(i-1)+(j-2);
if(status[index3]){
uf.union(index,index3);
}
}
if(j+1<=size){
int index4=size*(i-1)+(j);
if(status[index4]){
uf.union(index,index4);
}
}
}
}
public boolean isOpen(int i, int j){
return status[getIndex(i,j)];
}
public boolean isFull(int i, int j){
if(i<1||i>size||j<1||j>size){
throw new IndexOutOfBoundsException();
}
if(uf.connected(getIndex(i,j),top)&&isOpen(i,j))
{
return true;
}
return false;
}
public boolean percolates() {
if (uf.connected(top,bottom)) {
return true;
}
return false;
}
}
public class PercolationStats {
private final double[] ArrResult;
private final int num;
public PercolationStats(int N, int T) // perform T independent experiments on an N-by-N grid
{ ArrResult = new double[T];
num=T;
for(int k=0;k<num;k++){
final Percolation p =new Percolation(N);
int count =0;
double prob=0;
while(!p.percolates()){
int i=StdRandom.uniform(1,N);
int j=StdRandom.uniform(1,N);
if(!p.isOpen(i,j)){
p.open(i,j);
count++;
}
}
prob=(double)count/(N*N);
StdOut.println(prob);
ArrResult[k]=prob;
}
}
public double mean() // sample mean of percolation threshold
{
return StdStats.mean(ArrResult);
}
public double stddev() // sample standard deviation of percolation threshold
{
return StdStats.stddev(ArrResult);
}
public double confidenceLo() // low endpoint of 95% confidence interval
{
return mean()-((1.96*stddev())/Math.sqrt(num));
}
public double confidenceHi() // high endpoint of 95% confidence interval
{
return mean()+((1.96*stddev())/Math.sqrt(num));
}
public static void main(String[] args) // test client (described below)
{
final PercolationStats ps=new PercolationStats(Integer.parseInt(args[0]),
Integer.parseInt(args[1]));
StdOut.printf("mean =%s\n",ps.mean());
StdOut.printf("stddev =%s\n",ps.stddev());
StdOut.printf("conf interval =%s,%s\n",ps.confidenceLo(),ps.confidenceHi());
}
}
|