dp
代码:
#include<iostream>
#include<fstream>
using namespace std;
double dp[111][111];
int mark[101];
int l,b;
int n,m;
int ok(int s,int t){
int i,j,k;
k=s+t;
while(1)
{
if(k>n) k=2*n-k;
else
if(k<0) k=-k;
else
break;
}
if(mark[k]==2)
k=0;
return k;
}
void read(){
// ifstream cin("in.txt");
int i,j,k,s;
while(cin>>n>>m>>l>>b)
{
if(n==0&&m==0&&l==0&&b==0) return;
memset(mark,0,sizeof(mark));
memset(dp,0,sizeof(dp));
for(i=1;i<=l;i++)
{
cin>>j;
mark[j]=1;
}
for(i=1;i<=b;i++)
{
cin>>j;
mark[j]=2;
}
dp[0][0]=1;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
if(dp[i][j]>0)
{
for(k=1;k<=6;k++)
{
s=ok(j,k);
if(mark[s]!=1)
dp[i+1][s]+=1./6*dp[i][j];
else
dp[i+2][s]+=1./6*dp[i][j];
}
}
double ans=0;
for(i=1;i<=m;i++)
ans+=dp[i][n];
printf("%.6lf\n",ans);
}
}
int main(){
read();
return 0;
}