终于统计完了...
只有不到7个小时睡觉了... 澡还没洗...
工资果然不是白拿的...
女侠,约吗?
/* 65. ( NOI'94.1_1 ) 键盘输入一个仅由小写字母组成的字符串,输出以该串中任
取M个字母的所有排列及排列总数。*/
#include <iostream>
#define MAXN 100 //输入的字符串的最大长度,可任意改
#define MAX 500 //本程序所支持的最大排列数,可改
using namespace std;
int a[MAXN];
char result[MAX][MAXN];
int x=0,footer=0; //x记录组合数,x和footer作为result的行标和列标
void combin(int m,int n,char *tt); //求得从tt所指字符中选出n个字符的所有组合
int f(int n);
void permute(char*,int,int); //输出已知字符串的全排列
int main()
{
char *tt;
char n[5],data[MAXN];
int m;
cout<<"请输入字符串:"<<endl;
cin>>data;
do
{
cout<<"要取几个字符?(该数字必须小于或者等于"<<strlen(data)<<")"<<endl;
cin>>n;
cin.sync();
cin.clear();
m=strlen(data);
}while(m<atoi(n));
tt=data;
a[0]=atoi(n);
combin(m,atoi(n),tt);
int sum=x*f(a[0]);
cout<<"一共有"<<sum<<"种排列:"<<endl;
for(int i=0;i<x;i++)
permute(result[i],0,atoi(n));
return 0;
}
void combin(int m,int n,char *tt)
{
int i,j;
for (i=m;i>=n;i--)
{
a[n]=i;
if (n>1)
combin(i-1,n-1,tt);
else
{
x++;
for(j=a[0];j>0;j--)
result[x-1][footer++]=*(tt+a[j]-1);
footer=0;
}
}
}
int f(int n)
{
int s=1;
for(int i=1;i<=n;i++)
s*=i;
return s;
}
void permute(char a[],int m,int n)
{
int i;
if(m<n-1)
{
permute(a,m+1,n);
for (i=m+1;i<n;i++)
{
swap(a[m],a[i]);
permute(a,m+1,n);
swap(a[m],a[i]);
}
}
else
cout<<a<<endl;
}
[此贴子已经被作者于2007-6-28 19:47:53编辑过]
[此贴子已经被作者于2007-7-1 22:08:16编辑过]
补充118楼第6题(2),对HCL兄蛇型填数的改进,也不知道算不算改进?因为用三目符来代替if了
#include <iostream.h>
#define MAX 5int main()
{
int sum=0, j=0, t=1, start=0, end=0;
static int array[MAX][MAX];
for(sum = 0; sum < 2*MAX-1; sum++)
{
start = (sum < MAX)?0:sum-(MAX-1); //越过对角线后start和end范围递减
end = (sum < MAX)?sum:(MAX-1);
for(j = start; j <= end; j++)
//(sum%2)控制环绕方向==0和!=0的时候分别向不同的对角方向环绕
//随着j的增加sum-j渐小array[j][sum-j]时行渐大列渐小,
//array[sum-j][j]时相反
(sum%2!=0)?(array[j][sum-j] = t++):(array[sum-j][j] = t++);
}
for(sum = 0; sum < MAX; sum++)
{
for(j = 0; j < MAX; j++)
cout<<array[sum][j]<<'\t';
cout<<endl<<endl;
}return 0;
}
[此贴子已经被作者于2007-7-3 20:18:37编辑过]