剑指offer 面试题43 n个骰子点数和的分布律

来源:互联网 发布:exescope软件下载 编辑:程序博客网 时间:2024/05/09 03:15

n个骰子点数全排列

#include <iostream>using namespace std;//fuction to list all combinationsvoid DiceComb(int *NumArray,int n,int flag){if(flag==n){for(int i=0;i<n;++i)cout<<NumArray[i]<<' ';cout<<endl;return;}for(int i=1;i<=6;++i){NumArray[flag]=i;DiceComb(NumArray,n,flag+1);}}void Dice(int n){if(n<=0) return;int* NumArray=new int[n];DiceComb(NumArray,n,0);delete[] NumArray;}int main(){Dice(3);}

进一步改造为点数求和求分布律

#include <iostream>using namespace std;//get base^expint Power(int base,int exp){int result=1;while(exp>0){result*=base;--exp;}return result;}//recursion all the combinition and calcu sumvoid ProbalityCore(int* list,int* flag,int len,double* res){if(flag==list+len){int sum=0;for(int i=0;i<len;++i)sum+=list[i];res[sum-len]++;return;}for(int i=1;i<7;++i){*flag=i;ProbalityCore(list,flag+1,len,res);}}void Probality(int n){if(n<=0) return;int* list=new int [n];//define result tableint reslen=6*n-n+1;double* res=new double[reslen];for(int i=0;i<reslen;++i)res[i]=0;//recursion to modify the result tableProbalityCore(list,list,n,res);//divide 6^n to get the probality,then coutfor(int i=0;i<(6*n-n+1);++i){res[i]/=Power(6,n);cout<<i+n<<' '<<res[i]<<'\n';}//free the dynamic memorydelete[] list;delete[] res;}int main(){Probality(3);}
剔除点数组合的版本

void DiceComb(int *SumArray,int n,int flag,int Sum){if(flag==n){SumArray[Sum-n]++;return;}for(int i=1;i<=6;++i){int CurSum=Sum;CurSum+=i;DiceComb(SumArray,n,flag+1,CurSum);}}void Dice(int n){if(n<=0) return;//initial the SumArrayint SumArrayLen=6*n-n+1;int* SumArray=new int[SumArrayLen];for(int i=0;i<SumArrayLen;++i)SumArray[i]=0;//recursion helps the SumArray make senceDiceComb(SumArray,n,0,0);//cout the resultfor(int i=0;i<SumArrayLen;++i)cout<<i+n<<' '<<SumArray[i]<<endl;//free the dynamic memorydelete[] SumArray;}int main(){Dice(3);}

进一步求分布律

int Power(int base,int exp){int res=1;while(exp>0){res*=base;exp--;}return res;}void DiceComb(int *SumArray,int n,int flag,int Sum){if(flag==n){SumArray[Sum-n]++;return;}for(int i=1;i<=6;++i){int CurSum=Sum;CurSum+=i;DiceComb(SumArray,n,flag+1,CurSum);}}void Dice(int n){if(n<=0) return;//initial the SumArrayint SumArrayLen=6*n-n+1;int* SumArray=new int[SumArrayLen];for(int i=0;i<SumArrayLen;++i)SumArray[i]=0;//recursion helps the SumArray make senceDiceComb(SumArray,n,0,0);//cout the resultfor(int i=0;i<SumArrayLen;++i)cout<<i+n<<' '<<(double)SumArray[i]/Power(6,n)<<endl;//free the dynamic memorydelete[] SumArray;}

方法2:不用递归

void Dice_2(int n){if(n<=0) return;//initialize 2 arrayint ArrayLen=n*6+1;int* res[2];res[0]=new int [ArrayLen];res[1]=new int [ArrayLen];for(int i=0;i<ArrayLen;++i){res[0][i]=0;res[1][i]=0;}//first dicefor(int i=1;i<7;++i)res[0][i]=1;int flag=0;for(int k=2;k<=n;k++){//kth dicefor(int j=0;j<k;++j)res[1-flag][j]=0;for(int j=k;j<=k*6;++j){//clear the previous value,essential!res[1-flag][j]=0;//set value according to another arrayfor(int i=j-1;i>=0&&i>=j-6;i--){res[1-flag][j]+=res[flag][i];}}flag=1-flag;}for(int i=n;i<=n*6;i++){cout<<i<<' '<<(double)res[flag][i]/Power(6,n)<<'\n';}delete[] res[0];delete[] res[1];}

完整代码

#include <iostream>using namespace std;/*//fuction to list all combinationsvoid DiceComb(int *NumArray,int n,int flag){if(flag==n){for(int i=0;i<n;++i)cout<<NumArray[i]<<' ';cout<<endl;return;}for(int i=1;i<=6;++i){NumArray[flag]=i;DiceComb(NumArray,n,flag+1);}}void Dice(int n){if(n<=0) return;int* NumArray=new int[n];DiceComb(NumArray,n,0);delete[] NumArray;}*///fuction to int Power(int base,int exp){int res=1;while(exp>0){res*=base;exp--;}return res;}void DiceComb(int *SumArray,int n,int flag,int Sum){if(flag==n){SumArray[Sum-n]++;return;}for(int i=1;i<=6;++i){int CurSum=Sum;CurSum+=i;DiceComb(SumArray,n,flag+1,CurSum);}}void Dice(int n){if(n<=0) return;//initial the SumArrayint SumArrayLen=6*n-n+1;int* SumArray=new int[SumArrayLen];for(int i=0;i<SumArrayLen;++i)SumArray[i]=0;//recursion helps the SumArray make senceDiceComb(SumArray,n,0,0);//cout the resultfor(int i=0;i<SumArrayLen;++i)cout<<i+n<<' '<<(double)SumArray[i]/Power(6,n)<<endl;//free the dynamic memorydelete[] SumArray;}void Dice_2(int n){if(n<=0) return;//initialize 2 arrayint ArrayLen=n*6+1;int* res[2];res[0]=new int [ArrayLen];res[1]=new int [ArrayLen];for(int i=0;i<ArrayLen;++i){res[0][i]=0;res[1][i]=0;}//first dicefor(int i=1;i<7;++i)res[0][i]=1;int flag=0;for(int k=2;k<=n;k++){//kth dicefor(int j=0;j<k;++j)res[1-flag][j]=0;for(int j=k;j<=k*6;++j){//clear the previous value,essential!res[1-flag][j]=0;//set value according to another arrayfor(int i=j-1;i>=0&&i>=j-6;i--){res[1-flag][j]+=res[flag][i];}}flag=1-flag;}for(int i=n;i<=n*6;i++){cout<<i<<' '<<(double)res[flag][i]/Power(6,n)<<'\n';}delete[] res[0];delete[] res[1];}int main(){Dice(3);Dice_2(3);}



0 0
原创粉丝点击