这一道题与回溯法写的排列组合是很类似的,只是多了第一个的约束条件的限制,就是除了选出来的数都能相同,而且第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;
}
最强剑道:受尽苦难,不负野心,冲