回溯——伯努利装错信封问题

这一道题与回溯法写的排列组合是很类似的,只是多了第一个的约束条件的限制,就是除了选出来的数都能相同,而且第i个数也不能等于它本身的自然位。

对于回溯思想的解读,可见回溯法求解排列组合

运行结果:
结果

源码这里暂时不予给出,有需要的话,可以评论区留下自己的邮箱。(因为是作业,害怕自己出现类同代码。)

预计11月底,进行给出。

二更:
源码附上:

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	int letter[100]={0};
	int i=1;
	int count=0; 
	letter[i]=1;
	cin>>n;
	cout<<"n="<<n<<endl;
	while(1)
	{
		int flag=1;
		if(letter[i]==i)
		{
			flag=0;
		}
		else
		{
		    for(int j=1;j<i;j++)
		    {
		    	if(letter[i]==letter[j])                //约束条件,不与自己相对应 
		    	{
		    		flag=0;
		    		break;
				}
			}
		}
		
		if(flag&&i<n)                      //不满足条件,继续向下探索 
		{
			i++;
			letter[i]=1;
			continue;
		}
		
		if(flag&&i==n)                     //满足条件,进行输出。 
		{
			count++;
			cout<<"第"<<count<<"种:";
			for(int j=1;j<=n;j++)
			{
				cout<<letter[j]<<"     ";
			} 
			cout<<endl;
		}
		
		while(letter[i]==n&&i>1)                //向上回溯 
		{
			i--;
		}
		
		if(letter[i]==n&&i==1)                  //回溯到头了,退出循环 
		{
			break;
		}
		else                              //本阶段继续向下探索 
		{
			letter[i]++;
		}
	}
	cout<<"共"<<count<<"种装错方式"<<endl; 
}

索隆
最强剑道:受尽苦难,不负野心,冲

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值