问题描述:实现排列1,2,2,3这4个数字的所有情况,不准重复(不准有1223,1223这种情况),并依次输出每个排列
#include<iostream>
using namespace std;
class stack
{
public:
stack(){s= new int[100];top=0;}
void push(int a){s[top]=a;top++;}
int pop(){top--;return s[top];}
int getTop(){return s[top-1];}
int getLength(){return top;}
void output();
private:
int * s;
int top;
};
void stack::output()
{
for(int i=top-1;i>=0;i--)
cout<<s[i];
cout<<endl;
}
/*该函数实现排列1,2,2,3这4个数字的所有情况,不准重复,并依次输出*/
int num[]={1,2,2,3};
const int n=4;
int visit[n];//用于标记是否访问过了
void init()
{
for(int i=0;i<n;i++)
visit[i]=false;
}
void sortAndOutput( stack & s)
{
for(int i=0;i<n;i++)
{
if(i==1)//访问第一个2时
{
if(!visit[1])//如果这个2还未被访问过
{
visit[1]=true;
s.push(num[1]);
if(s.getLength()==n)
s.output();
sortAndOutput(s );
s.pop();
visit[1]=false;
}
}
else if(i==2)//访问第二个2
{
if(visit[1]&& !visit[2])//只有先访问了第一个2才可以访问第二个2
{
visit[2]=true;
s.push(num[2]);
if(s.getLength()==n)
s.output();
sortAndOutput(s );
s.pop();
visit[2]=false;
}else if(!visit[1]&&!visit[2])
{
}
}
else if(!visit[i])//访问其他的未访问元素
{
visit[i]=true;
s.push(num[i]);
if(s.getLength()==n)
s.output();
sortAndOutput( s);
s.pop();
visit[i]=false;
}
}
}
void sortNumber()
{
stack s;
init();
sortAndOutput(s);
}
int main()
{
sortNumber();
return 0;
}