题目描述
PIPI的控制台上有N个按钮,编号为1~N,每个按钮最多被按一次,每次可以同时按一个或多个按钮。一次操作是指每个按钮都被按到一次。
例如有4个按钮,你可以首先同时按下1和3,再按2和4,则操作可用字符串“13-24”表示,其他可行的方案还有“12-34”,“1-2-3-4”等等。
现在PIPI想知道N个按钮有哪些不重复的操作呢?(重复指的是组内数值相同,如“12-34”与“21-34”重复,注意“34-21”与“21-43”不重复)
请输出所有的操作
输入
多组数据。
每组数据一个整数N(1<=N<=8)
输出
按字典序输出所有的操作。
对于重复的操作,输出字典序最小的。
样例输入
3
样例输出
1-2-3
1-23
1-3-2
12-3
123
13-2
2-1-3
2-13
2-3-1
23-1
3-1-2
3-12
3-2-1
#include<bits/stdc++.h>
using namespace std;
int n,cnt;
char ans[20];
bool vis[10];
void dfs(int now,int last) ///现在已经放了now个数,last指上一次按的值
{
if(now==n)
{
for(int i=0; i<cnt; i++)
printf("%c",ans[i]);
printf("\n");
return;
}
for(int i=last+1; i<=n; i++) ///同一组中从小打到穷尽搜索就不会重复
{
if(vis[i])
continue;
vis[i]=1;
ans[cnt++]=i+'0';
if(now+1<n) ///尽可能的在每一组中添加'-','-'的优先级是最高的
{
ans[cnt++]='-';
dfs(now+1,0);///last从0开始,每添加一个-,重新分组
cnt--;
}
dfs(now+1,i); ///同一组中的值从last+1继续添加
vis[i]=0;
cnt--;
}
}
main()
{
while(scanf("%d",&n)!=EOF)
dfs(0,0);
}
来源:CSDN
作者:虱子555
链接:https://blog.csdn.net/weixin_44433678/article/details/104156892