PIPIOJ 1049: PIPI 的按钮Ⅰ

跟風遠走 提交于 2020-02-05 05:24:58

题目描述

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);
}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!