69,369
社区成员
发帖
与我相关
我的任务
分享
#include<iostream>
#include<cstdio>
#include<map>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
#include<set>
#include<string>
#include<queue>
#include <stack>
using namespace std;
#pragma warning(disable : 4996)
const int MAXN = 25;
int n, m;
int ans[MAXN];
int num[MAXN];
bool vis[MAXN];
void dfs(int x, int cnt)
{
if(cnt == n + 1)
{
for(int i = 1; i <= n; i++)
{
cout << ans[i] << " ";
}
cout << endl;
return;
}
for(int i = x; i <= m; i++)
{
if(!vis[i])
{
vis[i] = true;
ans[cnt] = num[i];
dfs(i, cnt + 1);
vis[i] = false;
}
}
}
int main()
{
while (cin >> m >> n)
{
for(int i = 1; i <= m; i++)
{
cin >> num[i];
}
memset(vis, false, sizeof(vis));
dfs(1, 1);
}
return 0;
}
http://blog.csdn.net/lgh1992314/article/details/8831834#include <stdio.h>
#include <stdlib.h>
#define MAX_NUM 26
int comb[MAX_NUM];
int c1,c2;
void combination(int m,int n) {
int i,j;
for (i=m;i>=n;i--) {
comb[n]=i; /* 选择当前的“头”元素 */
if (n>1) {
combination(i-1,n-1); /* 进入下一次更小的组合问题 */
} else { /* 满了需要的组合数,输出 */
for (j=comb[0];j>0;j--) printf("%c",'A'+c1-comb[j]);
printf("\n");
}
}
return;
}
int main(int argc,char **argv) {
if (argc<3) {
printf("%s 组合下标 组合上标\n",argv[0]);
return 1;
}
c1=atoi(argv[1]);
if (c1<1 || MAX_NUM<c1) {
printf("1<=组合下标<=%d\n",MAX_NUM);
return 2;
}
c2=atoi(argv[2]);
if (c2<1 || c1<c2) {
printf("1<=组合上标<=组合下标\n");
return 3;
}
comb[0]=c2;
combination(c1,c2);
return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int m;//记录字符串长度
int n;//记录字符串中的字符种类数
char map[256];//记录是哪几种字符
int count[256];//记录每种字符有多少个
int stack[1000];//递归用的栈,并记录当前生成的排列
void Make_Map(char *str) {//统计字符串的相关信息
int s[256];
int i;
memset(s,0,sizeof(s));
memset(count,0,sizeof(count));
m=strlen(str);
while(*str) {
s[*str]++;
str++;
}
n=0;
for (i=0;i<256;i++)
if (s[i]) {
map[n]=i;
count[n]=s[i];
n++;
}
}
void Find(int depth) {//递归式回溯法生成全排列
if (depth==m) {
int i;
for (i=0;i<depth;i++) putchar(map[stack[i]]);
putchar('\n');
} else {
int i;
for (i=0;i<n;i++)
if (count[i]) {
stack[depth]=i;
count[i]--;
Find(depth+1);
count[i]++;
}
}
}
void main(int argc,char**argv) {
if (argc<2) {
printf("%s 要产生全排列的字符串\n",argv[0]);
return;
}
Make_Map(argv[1]);
Find(0);
}
#include <stdio.h>
#include <malloc.h>
#define NUMBER_ONE 3
#define NUMBER_ZERO 2
#define NUMBER_TOTAL (NUMBER_ZERO+NUMBER_ONE)
int for_out[NUMBER_TOTAL];
void result_out()
{
int for_i;
for(for_i=0;for_i<NUMBER_TOTAL;for_i++)
{
printf("%d ",*(for_out+for_i));
}
printf("\n");
}
void swap(int from,int to)
{
int temp;
temp=*(for_out+from);
*(for_out+from)=*(for_out+to);
*(for_out+to)=temp;
}
void main()
{
int for_i,for_j,for_x,for_y;
for(for_i=0;for_i<NUMBER_ONE;for_i++)
{
*(for_out+for_i)=1;
}
for(for_i;for_i<NUMBER_TOTAL;for_i++)
{
*(for_out+for_i)=0;
}
result_out();
for_x=for_y=NUMBER_ONE-1;
while(for_x<NUMBER_TOTAL-1)
{
for_out[for_x]=0;
for_out[for_y]=1;
for_x++;
for_y++;
if(for_out[for_x]==0)
{
for_out[for_x]=1;
for_out[0]=0;
if(for_y>1)
{
for_x=1;
}
for_y=0;
}
result_out();
}
}
#include <stdio.h>
#include <malloc.h>
#define NUMBER_ONE 3
#define NUMBER_ZERO 2
#define NUMBER_TOTAL (NUMBER_ZERO+NUMBER_ONE)
int for_out[NUMBER_TOTAL];
void result_out()
{
int for_i;
for(for_i=0;for_i<NUMBER_TOTAL;for_i++)
{
printf("%d ",*(for_out+for_i));
}
printf("\n");
}
void main()
{
int for_i,for_x,for_y;
for(for_i=0;for_i<NUMBER_ONE;for_i++)
{
*(for_out+for_i)=1;
}
for(for_i;for_i<NUMBER_TOTAL;for_i++)
{
*(for_out+for_i)=0;
}
result_out();
for_x=for_y=NUMBER_ONE-1;
while(for_x<(NUMBER_TOTAL-1))
{
for_out[for_x]=0;
for_out[for_y]=1;
for_out[0]=for_out[for_x+1];
for_out[for_x+1]=1;
for_x=1+(for_x)*(1-(for_out[1])*(1-for_out[0]));
for_y=for_out[0]*(for_y+1);
result_out();
}
}
#include <stdio.h>
#include <malloc.h>
#define MAX 4
int for_out[MAX];
int sum=0;
void out_put()
{
int for_i;
for(for_i=0;for_i<MAX;for_i++)
{
printf("%d ",for_out[for_i]);
}
printf("\n");
}
void reverse(int a)
{
int for_i,temp,total;
total=MAX-a;
total=total/2;
for(for_i=0;for_i<total;for_i++)
{
temp=for_out[a+for_i];
for_out[a+for_i]=for_out[MAX-1-for_i];
for_out[MAX-1-for_i]=temp;
}
}
void main()
{
int for_i,for_j,temp;
for(for_i=0;for_i<MAX;for_i++)
{
for_out[for_i]=for_i;
}
for_i=1;
while(1)
{
out_put();
for_i=0;
while((for_i<MAX-1)&&(for_out[MAX-1-for_i]<for_out[MAX-2-for_i]))
{
for_i++;
}
if(for_i==MAX-1)
{
return 1;
}
else
{
if(for_i==0)
{
temp=for_out[MAX-1];
for_out[MAX-1]=for_out[MAX-2];
for_out[MAX-2]=temp;
}
else
{
temp=for_out[MAX-2-for_i];
for_j=MAX-1-for_i;
while(for_j<MAX&&for_out[for_j]>temp)
{
for_j++;
}
for_out[MAX-2-for_i]=for_out[for_j-1];
for_out[for_j-1]=temp;
reverse(MAX-for_i-1);
}
}
}
}
void GetArray(int n, vector<int> vTmp, vector<vector<int> > &vArray)
{
if (n == 1)
{
vTmp.push_back(n);
vArray.push_back(vTmp);
return;
}
GetArray(n-1, vTmp, vArray);
unsigned int nArray = vArray.size();
for (unsigned int i=0; i<nArray; i++)
{
for (int j=0; j<n-1; j++)
{
vTmp.assign(vArray[i].begin(), vArray[i].end());
vTmp.insert(vTmp.begin()+j, n);
vArray.push_back(vTmp);
}
vArray[i].push_back(n);
}
}
void PrintArray(vector<vector<int> > &vArray)
{
for (unsigned int i=0; i<vArray.size(); i++)
{
for (unsigned int j=0; j<vArray[i].size(); j++)
{
cout << vArray[i][j] << " ";
}
cout << endl;
}
}
int main(int argc, char** argv)
{
vector<vector<int> > vArray;
vector<int> vTmp;
GetArray(5, vTmp, vArray);
//PrintArray(vArray);
cout << vArray.size() << endl;
vTmp.clear();
vArray.clear();
GetArray(10, vTmp, vArray);
//PrintArray(vArray);
cout << vArray.size() << endl;
double t; //计算运行时间的代码
clock_t time;
time=clock();
t=(double)time/CLK_TCK;
cout<<"time is "<<t<<" seconds "<<endl;
getchar();
return 0;
}
#include <iostream>
#include <vector>
#include<time.h>
using namespace std;
void GetCompose(int n, int m, vector<int> vTmp, vector<vector<int> > &vSplit)
{
if (n == m)
{
for (int i=m; i>=1; i--)
{
vTmp.push_back(i);
}
vSplit.push_back(vTmp);
return;
}
// 不选n
GetCompose(n-1, m, vTmp, vSplit);
// 选n
vTmp.push_back(n);
if (m == 1)
{
vSplit.push_back(vTmp);
return;
}
GetCompose(n-1,m-1, vTmp, vSplit);
};