这个问题是一个全排列问题,我使用的是递归算法来求解的,过程还是很有意思的~
题目:http://acm.nyist.net/JudgeOnline/problem.php?pid=19
#include<iostream>
#include<math.h>
#include<memory.h>
using namespace std ;
int n,m;
int a[10];
int visit[10]; //下面以取两位数为例
void Recursive(int c)
{
if(c==m)
{
int result=0;
for(int i=0;i<m;i++)
result=a[i]*pow(10,m-1-i)+result; //因为a[]存入的是全排列的答案,第一次a[0]=1 a[2]=2 第二次a[0]=1 a[2]=3 这个是按照最高位到最小为依次从小到大输出的,有的童鞋是依次输出a,我是求出页数的值在console没什么区别。
cout<<result<<endl;
}
else
{
for(int i=0;i<n;i++) //先确定a[0],然后递归调用确定a[1]在递归时c+2(0+2)碰到第一个判断输出,回到第二个递归的循环,不断改变a[1]
{
if(!visit[i])
{ visit[i]++;
a[c]=i+1;
Recursive(c+1);
visit[i]--;
}
}
}
}
int main()
{ int num;
cin>>num;
while(num--)
{
cin>>n>>m;
memset(visit,0,sizeof(visit)); //visit全部赋值为0;
Recursive(0);
}
}