王梓涵
( 梦幻の幸运使者 qwq)
1
为啥第k个排列tle了啊,我觉得没问题啊?
快来帮忙看看。
#include
using namespace std;
int ans[15],vis[15]={0};
int n,cnt=0;
void dfs(int,int);
int main(){
cin>>n;
for(int i=1;i<=n;i++){
dfs(1,i);
}
}
void dfs(int k,int last){
if(k==last+1){
cnt++;//第几项计算
if(n==cnt){//看看项数是否匹配
for(int i=1;i<k;i++){
cout<<ans[i]<<’ ';
}
}
return;
}
for(int i=1;i<=last;i++){
if(vis[i]==0){
ans[k]=i;
vis[i]=1;
dfs(k+1,last);
vis[i]=0;
}
}
}
7 个赞
王梓涵
( 梦幻の幸运使者 qwq)
2
题目:我们将所有的全排列按照如下规则进行排序:
如果长度不同,那么长度小的排前面;否则,字典序小的排前面。
请找到按照这个规则排序得到的第n 个排列。
样例
输入:6 输出:2 1 3
6 个赞
白桐吉
(■ ꧁༻残缺ぁ神迹々龙つ随风༻꧂)
3
@王梓涵 代码不太全,在下面重新发下吧?不太好复制诶
5 个赞
王梓涵
( 梦幻の幸运使者 qwq)
5
#include
using namespace std;
int ans[15],vis[15]={0};
int n,cnt=0;
void dfs(int,int);
int main(){
cin>>n;
for(int i=1;i<=n;i++){
dfs(1,i);
}
}
void dfs(int k,int last){
if(k==last+1){
cnt++;//第几项计算
if(n==cnt){//看看项数是否匹配
for(int i=1;i<k;i++){
cout<<ans[i]<<’ ';
}
}
return;
}
for(int i=1;i<=last;i++){
if(vis[i]==0){
ans[k]=i;
vis[i]=1;
dfs(k+1,last);
vis[i]=0;
}
}
}
6 个赞
白桐吉
(■ ꧁༻残缺ぁ神迹々龙つ随风༻꧂)
6
@王梓涵
问题
1.判断if(cnt == n)里的输出 的空格的单引号有个是全角
2.判断if(cnt == n)还要在这个输出后加个exit(0)代表结束整个程序,而return在dfs()中只是结束某个分支
5 个赞