(想偷懒看了一眼题解,全都是next_permutation属于是和题目要求的完全不一样了,于是就自己写了一篇)

为什么有些题解用的是c++的next_permutation要说代码是c的。



解题思路:
用回溯得到排列结果,用标记去重复
注意事项:
如果想用c提交就把bool换成char;sort换成自己写的排序;6!=720,即全排列最多720种(数组范围确定);
参考代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>//提供快排的c++头文件 
char a[12],out[725][7];
bool mark[12],overlap[725];
int len,cnt;
void range(int num)
{ if(num>=len)
  { cnt++;
    strcpy(out[cnt],out[cnt-1]);
    return;
  }
  for(int i=0;i<len;i++)if(!mark[i])out[cnt][num]=a[i],mark[i]=1,range(num+1),mark[i]=0;
}
void elimination(int num)
{ for(int i=0;i<cnt-1;i++)for(int j=i+1;j<cnt;j++)if(strcmp(out[i],out[j])==0)overlap[j]=1;
}
main()
{ scanf("%s",a);
  len=strlen(a);
  std::sort(a,a+len);//快排//什么排序都可以,不过我比较懒
  range(0);//回溯求排列
  elimination(0);//标记重复的
  for(int i=0;i<cnt;i++)if(!overlap[i])printf("%s\n",out[i]);
}


点赞(0)
 

0.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论