题意:
输入一个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<bits/stdc++.h>
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;
}