hiho一下 第220周 Push Button I

题意:

输入一个n,输出一个带有‘-’分组意味的全排列。注意输出序列是严格每个区域递增,并且12-34 和 12-43是等价的。
题目链接

样例:

样例输入

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

思路:

明显是一个需要修改搜索策略的搜索(暴力)问题。从12-34 和 12-43等价可以分析每个’-‘分割的区域内都是递增序列,同时按这个顺序输出也满足输出的条件。又根据输出条件我们可以分析每次(1)优先分出一个新组即插入一个’-’,(2)再考虑选出一个比当前前一个位置大的数加入序列。这样,搜索的策略也分析出来。

#include
using namespace std;
const int maxn = 200;
int n,vis[maxn];
char ans[maxn] = "-";
void dfs(int pos,int cur){
   if(cur == n){
     for(int i=1;i<pos;i++){
        printf("%c",ans[i]);
     }
     printf("\n");
     return;
   }
   if(ans[pos-1] =='-'){ 
     for(int i=1;i<=n;i++){
        if(vis[i]== 0){
            vis[i] = 1;
            ans[pos] = i+ '0';
            dfs(pos+1, cur+1);
            vis[i] = 0;
        }
     }
     return;
   }
   ans[pos] = '-';
   dfs(pos+1,cur);
   for(int i = ans[pos-1]-'0'+1;i <= n;i++){
     if(vis[i]== 0){
        vis[i] = 1;
        ans[pos] = i+ '0';
        dfs(pos+1, cur+1);
        vis[i] = 0;
     }
   }
}

int main(){
     while(~scanf("%d",&n)){
        memset(vis,0,sizeof(0));
        dfs(1,0);
     }
     return 0;
}

你可能感兴趣的:(每周一题(,hihocode,leetcode))