Sayfalar

15 Ocak 2017

Euler Projesi 213. Soru

Pire Sirki

30x30 kare tahta üzerinde başlangıçta her karede bir pire olacak şekilde toplam 900 pire var.

Bir zil çaldığında, her pire komşu bir kareye rastgele zıplıyor (köşeler ve kenar kareler hariç genellikle 4 olası kareye).

50 zil çaldıktan sonra boş kalan karelerin beklenen değeri nedir? Cevabınızı 6 ondalık basamağa yuvarlayarak veriniz.


Cevap: 330,721154

Java:
void doit() throws Exception{
	double[][][][] grid = new double[900][2][30][30];
	int[] dx = {-1,1,0,0};
	int[] dy = {0,0,1,-1};
	for(int f = 0; f < 900; f++){
		grid[f][0][f%30][f/30] = 1;
		for(int r = 1; r <= 50; r++){
			int cur = r%2;
			int prev = 1-cur;
			grid[f][cur] = new double[30][30];
			for(int x = 0; x < 30; x++){
				for(int y = 0; y < 30; y++){
					int tot = 4;
					if(x == 0 || x == 29) tot--;
					if(y == 0 || y == 29) tot--;
					for(int d = 0; d < 4; d++){
						int nx = x+dx[d];
						int ny = y+dy[d];
						if(nx < 0 || ny < 0 || nx >= 30 || ny >= 30) continue;
						grid[f][cur][nx][ny] += grid[f][prev][x][y]/tot;
					}
				}
			}
		}
	}
	double ret = 0;
	for(int x = 0; x < 30; x++){
		for(int y = 0; y < 30; y++){
			double p = 1;
			for(int f = 0; f < 900; f++){
				p *= 1-grid[f][0][x][y];
			}
			ret += p;
		}
	}
	System.out.printf("%.6f%n",ret);
}
 
Matlab:
n=30; x=50;

a=zeros(n*n,n*n);

for i=1:n
    if(i>1 && i<n), H=4;
    else H=3; end
    
    for j=1:n
        if(j>1 && j<n), H2=1/H;
        else H2=1/(H-1); end
        
        row = (i-1)*n+j;
        if(i>1), a(row,(i-2)*n+j)=H2; end
        if(i<n), a(row,(i  )*n+j)=H2; end
        if(j>1), a(row,(i-1)*n+j-1)=H2; end
        if(j<n), a(row,(i-1)*n+j+1)=H2; end
    end
end

answer = sum(prod(1-a^x))
 
c++:

#include <stdio.h>


#define N 30
#define steps 50

int main()  {
    
    int i,j,k,l,d,s,x,y;
    int dx[4]={1,-1,0,0};
    int dy[4]={0,0,1,-1};
    double sum,ct[N][N],A[N][N],B[N][N],tot[N][N];
    
    for(i=0;i<N;i++)  {
        for(j=0;j<N;j++)  {
            if((i==0)||(i==N-1)||(j==0)||(j==N-1))  ct[i][j]=1.0/3.0;
            else ct[i][j]=0.25;
        }
    }
    ct[0][0]=0.5;
    ct[0][N-1]=0.5;
    ct[N-1][0]=0.5;
    ct[N-1][N-1]=0.5;
    
    for(i=0;i<N;i++)
        for(j=0;j<N;j++)  tot[i][j]=1.0;
        
    for(i=0;i<N;i++)  {
        for(j=0;j<N;j++)  {
            for(k=0;k<N;k++)
                for(l=0;l<N;l++)  A[k][l]=0.0;
            A[i][j]=1;
            for(s=1;s<=steps;s++)  {
                for(k=0;k<N;k++)
                    for(l=0;l<N;l++)  B[k][l]=A[k][l],A[k][l]=0.0;
                for(k=0;k<N;k++)  {
                    for(l=0;l<N;l++)  {
                        for(d=0;d<4;d++)  {
                            x=k+dx[d];
                            y=l+dy[d];
                            if((x>=0)&&(x<N)&&(y>=0)&&(y<N))  A[x][y]+=B[k][l]*ct[k][l];
                        }
                    }
                }
           }
           for(k=0;k<N;k++)
               for(l=0;l<N;l++)  tot[k][l]*=1.0-A[k][l];
      }
   }
   sum=0.0;
   for(i=0;i<N;i++)
       for(j=0;j<N;j++)  sum+=tot[i][j];
   printf("%.6lf\n",sum);
   return 0;
}
 
Pascal:
program project_euler_problem_213;

{ Flea Circus }

var                  a : array[1..30,1..30,1..3] of real;
       j,k,n,u,w,x,y,z : shortint;
                     v : real;

begin
  for x := 1 to 30 do
    for y := 1 to 30 do
      a[x,y,3] := 1;
  for u := 1 to 15 do
    for w := 1 to 15 do
      begin
        for x := 1 to 30 do
          for y := 1 to 30 do
            for z := 1 to 2 do
              a[x,y,z] := 0;
        a[u,w,1] := 1;
        z := 1;
        j := 2;
        for n := 1 to 50 do
          begin
            for x := 2 to 29 do
              for y := 2 to 29 do
                begin
                  v := a[x,y,z]/4;
                  a[x-1,y,j] += v;
                  a[x+1,y,j] += v;
                  a[x,y-1,j] += v;
                  a[x,y+1,j] += v
                end;
            v := a[1,1,z]/2;
            a[1,2,j] += v;
            a[2,1,j] += v;
            v := a[30,1,z]/2;
            a[29,1,j] += v;
            a[30,2,j] += v;
            v := a[1,30,z]/2;
            a[1,29,j] += v;
            a[2,30,j] += v;
            v := a[30,30,z]/2;
            a[30,29,j] += v;
            a[29,30,j] += v;
            for x := 2 to 29 do
              begin
                v := a[x,1,z]/3;
                a[x-1,1,j] += v;
                a[x+1,1,j] += v;
                a[x,2,j] += v
              end;
            for x := 2 to 29 do
              begin
                v := a[x,30,z]/3;
                a[x-1,30,j] += v;
                a[x+1,30,j] += v;
                a[x,29,j] += v
              end;
            for y := 2 to 29 do
              begin
                v := a[1,y,z]/3;
                a[1,y-1,j] += v;
                a[1,y+1,j] += v;
                a[2,y,j] += v
              end;
            for y := 2 to 29 do
              begin
                v := a[30,y,z]/3;
                a[30,y-1,j] += v;
                a[30,y+1,j] += v;
                a[29,y,j] += v
              end;
            for x := 1 to 30 do
              for y := 1 to 30 do
                a[x,y,z] := 0;
            k := z;
            z := j;
            j := k
          end;
        for x := 1 to 30 do
          for y := 1 to 30 do
            a[x,y,3] *= 1-a[x,y,z]
      end;
  v := 0;
  for x := 1 to 30 do
    for y := 1 to 30 do
      v += a[x,y,3] * a[31-x,y,3] * a[x,31-y,3] * a[31-x,31-y,3];
  writeln(v);
  readln
end.
 
Basic:
Dim b(30, 30, 30, 30, 50) As Double, k As Integer, i As Integer, j As Integer, x As Integer, y As Integer
        Dim st As Integer, si As Integer
        st = 50
        si = 30
        Dim a(1, si * si) As Double
        Dim ax(1, si * si, si * si) As Double
        Dim axy(1, si * si, si * si)() As Single
        Dim p(si * si, si * si) As Double
        For n = 0 To 1
            For k = 0 To si * si
                For x = 0 To si * si
                    ReDim axy(n, k, x)(x)
                Next
                Console.WriteLine(k)
            Next
        Next
        For i = 1 To 30
            For j = 1 To 30
                b(i, j, i, j, 0) = 1
            Next
        Next
        For k = 1 To st
            For i = 1 To si
                For j = 1 To si
                    For x = 2 To si - 1
                        For y = 2 To si - 1
                            b(i, j, x - 1, y, k) += b(i, j, x, y, k - 1) / 4
                            b(i, j, x + 1, y, k) += b(i, j, x, y, k - 1) / 4
                            b(i, j, x, y - 1, k) += b(i, j, x, y, k - 1) / 4
                            b(i, j, x, y + 1, k) += b(i, j, x, y, k - 1) / 4
                        Next
                    Next
                    For y = 2 To si - 1
                        b(i, j, 1, y - 1, k) += b(i, j, 1, y, k - 1) / 3
                        b(i, j, 1, y + 1, k) += b(i, j, 1, y, k - 1) / 3
                        b(i, j, 2, y, k) += b(i, j, 1, y, k - 1) / 3
                        b(i, j, si, y - 1, k) += b(i, j, si, y, k - 1) / 3
                        b(i, j, si, y + 1, k) += b(i, j, si, y, k - 1) / 3
                        b(i, j, si - 1, y, k) += b(i, j, si, y, k - 1) / 3
                    Next
                    For x = 2 To si - 1
                        b(i, j, x - 1, 1, k) += b(i, j, x, 1, k - 1) / 3
                        b(i, j, x + 1, 1, k) += b(i, j, x, 1, k - 1) / 3
                        b(i, j, x, 2, k) += b(i, j, x, 1, k - 1) / 3
                        b(i, j, x - 1, si, k) += b(i, j, x, si, k - 1) / 3
                        b(i, j, x + 1, si, k) += b(i, j, x, si, k - 1) / 3
                        b(i, j, x, si - 1, k) += b(i, j, x, si, k - 1) / 3
                    Next
                    b(i, j, 1, 2, k) += b(i, j, 1, 1, k - 1) / 2
                    b(i, j, 2, 1, k) += b(i, j, 1, 1, k - 1) / 2
                    b(i, j, 1, si - 1, k) += b(i, j, 1, si, k - 1) / 2
                    b(i, j, 2, si, k) += b(i, j, 1, si, k - 1) / 2
                    b(i, j, si, 2, k) += b(i, j, si, 1, k - 1) / 2
                    b(i, j, si - 1, 1, k) += b(i, j, si, 1, k - 1) / 2
                    b(i, j, si, si - 1, k) += b(i, j, si, si, k - 1) / 2
                    b(i, j, si - 1, si, k) += b(i, j, si, si, k - 1) / 2
                Next
            Next
        Next
        For i = 1 To si * si
            For k = 1 To si * si
                p(i, k) = b((i - 1) \ si + 1, (i - 1) Mod si + 1, (k - 1) \ si + 1, (k - 1) Mod si + 1, st)
            Next
        Next
        Dim an As Integer, an1 As Integer
        an = 1
        a(1, 1) = 1
        For x = 1 To si * si
            ax(1, 1, x) += p(1, x)
        Next
        For n = 2 To si * si
            an1 = an
            an = 1 - an
            Console.WriteLine(n)
            For k = 1 To n
                a(an, k) = 0
                For x = 1 To si * si
                    a(an, k) += (ax(an1, k, x) + a(an1, k - 1) - ax(an1, k - 1, x)) * p(n, x)
                    ax(an, k, x) = ax(an1, k, x) * p(n, x) + (a(an1, k - 1) - ax(an1, k - 1, x)) * p(n, x)
                    For y = 1 To x - 1
                        ax(an, k, x) += (axy(an1, k, x)(y) + ax(an1, k - 1, x) - axy(an1, k - 1, x)(y)) * p(n, y)
                        axy(an, k, x)(y) = (axy(an1, k, x)(y) - axy(an1, k - 1, x)(y)) * (p(n, x) + p(n, y)) + ax(an1, k - 1, y) * p(n, x) + ax(an1, k - 1, x) * p(n, y)
                    Next
                    For y = x + 1 To si * si
                        ax(an, k, x) += (axy(an1, k, y)(x) + ax(an1, k - 1, x) - axy(an1, k - 1, y)(x)) * p(n, y)
                    Next
                Next
            Next
        Next
        Dim res As Double
        For i = 1 To si * si
            res += i * a(an, si * si - i)
        Next
        MsgBox(res)