您好,欢迎来到测品娱乐。
搜索
您的当前位置:首页[转载]伯努利装错信封问题

[转载]伯努利装错信封问题

来源:测品娱乐
[转载]伯努利装错信封问题

原⽂地址:伯努利装错信封问题作者:NINO今天是我⼀次写博客,之所以开这个博客也是受学长的启发,希望借这个博客好好整理⼀下,以后这⾥会有⼀些我认为有帮助的题⽬,有⽔题也有难题(可能对我来说),废话不说,直接说今天这道题。

这道题本质上就是全错排,我想很久都没有头绪,肯能是受装苹果问题的印象,⼀开始我就认为这是⽤递归做,这题⼤概下⼀篇博⽂我就很整理⼀下,受其影响,我认为也应该会是先确定⼀位,再⼀次往下推;

后来在群⾥听⼀些盆友的分析,知道了应该全排列,然后排除⼀些特殊的,怎么全牌呢?有两种思路,⼀个⼤概是放⼀个数组,这个数组表⽰⼀个数字,然后按数字的递增来表⽰全排列,另⼀种就是所谓的算法,显然我⼊了这个坑,,,虽然输出顺序有错,但细细想这个算法还是很赞的,事先声明,回溯法对此题并不受⽤,,,后来⾼中同学给了我⼀个代码,在他的指点下,我写了这个代码

#includeint count=0;

void print(int *,int);void fun(int *,int,int);int main(){ int arry[7]; int n;

scanf(\"%d\ fun(arry,0,n-1); if(count%5==0)

printf(\"s=%dn\ else

printf(\"ns=%dn\ return 0;}

//打印兼排除

void print(int *a,int n){ int i,j,flag=1;//排除⾮错位的 for(i=0;i<=n;i++) if(*(a+i)==i+1){ flag = 0; break; }

//排除重复的

for(i=0;i<=n;i++) for(j=i+1;j<=n;j++) if(*(a+i)==*(a+j)){ flag = 0; break; } if(flag){ count++;

if(count%5!=0){ for(i=0;i

printf(\"%d\ printf(\"%d \ } else{

for(i=0;i

printf(\"%d\

printf(\"%dn\ } }}

void fun(int *a,int index,int n){ if(index==n+1) print(a,n); else{

for(*(a+index)=1;*(a+index)<=n+1;(*(a+index))++) fun(a,index+1,n); }}

后来,⽼师给我⼀个算法,这个算法竟然不⽤递归,简直极好的,#include

int fun(int i,int n){

int a[10],j,k;

for(j=n-1;j>=0;j--) {

a[j]=i; i/=10; }

for(j=0;j {

if(a[j]==j+1) break;

if(a[j]>n||a[j]==0) break; for(k=j+1;k

if(a[j]==a[k]) break; if(k!=n) break; }

if(j==n) return 1; else return 0;}

int main(){

int n,i,s=0,a=1; double b;

scanf(\"%d\ b = n + n*0.1; for(i=0;i a*=10; b*=10; }

for(i=a;i

if(fun(i,n)==1) {

s++;

if(s%5==0) printf(\"%dn\ else printf(\"%d \ }

if(s%5!=0) printf(\"n\"); printf(\"s=%dn\ return 0;

}

其实百度知道也有这个代码,它的⽅法也和第⼀个异曲同⼯,可以说是加强版的;第⼆个思路很赞,但只能说是技巧,

#include#includeint printed;

void draw(int* a,int k){

int i; for(i=0;i {

printf(\"%d\",a[i]); }

printf(\"n\");}

void Settle(int *a,int iStep,int k){

int i; for(i=0;i

if(a[iStep-1]==a[i]) return; if(iStep==k) {

draw(a,k); printed++; }

for(i=1;i<=k;i++) {

if(i==iStep+1) continue; a[iStep]=i;

Settle(a,iStep+1,k); }}

void main(){

int* a; int k;

scanf(\"%d\",&k);

a=(int*)calloc(k,sizeof(int)); Settle(a,0,k);

printf(\"s=%dn\",printed);}

总结:这种递归格式很值得推崇,代码的模块化显然也是这⼏个代码的共同的优势所在,

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- cepb.cn 版权所有 湘ICP备2022005869号-7

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务