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