要排序,简单的dfs,跑出所有组合,几年前,oj上好像做过,忘了
#include<stdio.h>
#include<string.h>
int sum=0,n,vis[100][10],ans[1000],x,y;
char s[50][100];
void del()
{
sum=1;
if(ans[0]==2)
{
sum=12;
}
for(int i=0; i<n-1; i++)
{
if(ans[i]==0&&ans[i+1]!=2)
{
sum+=(i+2);
}
if(ans[i]==0&&ans[i+1]==2)
{
sum+=((i+2)*10+(i+3));
i++;
}
if(ans[i]==1&&ans[i+1]!=2)
{
sum-=(i+2);
}
if(ans[i]==1&&ans[i+1]==2)
{
sum-=((i+2)*10+(i+3));
i++;
}
if(ans[i]==2&&ans[i+1]==2)
{
sum=10000000;//赋予极大值
}
}
}
void print()
{
if(sum==0)
{
//printf("1");
y=0;
s[x][y++]='1';
for(int i=0; i<n-1; i++)
{
if(ans[i]==0)
{
//printf("+");
s[x][y++]='+';
}
if(ans[i]==1)
{
//printf("-");
s[x][y++]='-';
}
if(ans[i]==2)
{
//printf(" ");
s[x][y++]=' ';
}
s[x][y++]=(i+2)+'0';
//printf("%d",i+2);
}
s[x++][y]='\0';
}
}
void sort1()
{
for(int i=0; i<x; i++)
{
for(int j=i; j<x; j++)
{
if(strcmp(s[i],s[j])>0)
{
char t[100];
strcpy(t,s[i]);
strcpy(s[i],s[j]);
strcpy(s[j],t);
}
}
}
for(int i=0; i<x; i++)
printf("%s\n",s[i]);
}
void dfs(int cur)
{
if(cur==n-1)
{
del();
print();
return ;
}
for(int i=0; i<3; i++)
{
if(!vis[cur][i])
{
vis[cur][i]=1;
ans[cur]=i;
dfs(cur+1);
vis[cur][i]=0;
}
}
}
void init()
{
x=0;
for(int i=0; i<10; i++)
{
ans[i]=0;
}
vis[0][0]=0;
sum=0;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
init();
dfs(0);
sort1();
}
}