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)