2.求集合的冥集
代碼:
void GetPowerSet1(int i,char a[],char b[],int n)
{
//功能:求以數組a中元素為集合中元素的集合的冥集
int j;
if(i==n-1)
{
b[n]='/0';
for(j=0;j<n+1;j++)
if(b[j]!=' ') cout<<b[j]; //對空格不輸出
cout<<endl;
}
else
{
b[i]=a[i]; GetPowerSet(i+1,a,b,n);
b[i]=' '; GetPowerSet(i+1,a,b,n);
}
}
後記:適當改造可以用來求一個字串的所有子串.
3.將任意整數N,分解成多個互不相同的正整數的和,列印所
有可能的組合方式。例如:n=6,組合方式有1+5,2+4,1+2+3。
N=20的例子:
#include <iostream.h>
bool visited[21];
bool c[40];
void get_arr(int b[],int i);
int main()
{
int i,j,b[20];
for(i=0;i<21;i++)
visited[i]=0;
for(i=0;i<40;i++)
{
for(j=2;j<i/2;j++)
if(i%j==0)
{ c[i]=0;break;}
if(j==i/2) c[i]=1;
}
c[4]=0;
for(i=1;i<21;i++)
{
b[0]=i;
visited[i]=1;
get_arr(b,0);
visited[i]=0;
}
return 0;
}
void get_arr(int b[],int i)
{
int m,j;
if(i>18)
{
if(c[b[0]+b[19]]==1)
{
for(m=0;m<20;m++)
cout<<b[m]<<" ";
cout<<endl;
}
}
else
{
for(j=1;j<21;j++)
if(visited[j]==0&&c[b[i]+j]==1)
{
b[i+1]=j;
visited[j]=1;
get_arr(b,i+1);
visited[j]=0;
}
}
}
後記:未遇到相關應用
4.經典的四皇后問題
void Trial(int i,int n,int a[])
{
//n皇后問題 ,初始狀態沒有棋子(即a={0})
int col,row,j,flag,k;
if(i>=n)
{
for(col=0;col<n;col++)
for(row=0;row<n;row++) //輸出最終布局(1代表棋子所在位置)
{
cout<<a[col*n+row];
if(row==n-1) cout<<endl;
}
cout<<endl;
}
else
for(j=0;j<n;j++)
{
a[i*n+j]=1;
flag=1;
//在每個檢驗中加入了flag是否等於1的判斷,以提高速度
for(col=0;col<n&&flag==1;col++)
if(a[col*n+j]==1&&col!=i) //檢驗行是否符合要求
{flag=0;break;}
for(row=0;row<n&&flag==1;row++)
if(a[i*n+row]==1&&row!=j) //檢驗列
{flag=0;break;}
for(k=i+j,col=k-n+1,row=n-1;col<n&&flag==1;row--,col++)
if(a[col*n+row]==1&&col!=i) //檢驗主對角線
{flag=0;break;}
if(flag==1)
{
//檢驗副對角線,分情況檢驗
if(i<j)
{
for(k=i>j?i-j:j-i,col=0,row=k;row<n;row++,col++)
if(a[col*n+row]==1&&col!=i)
{flag=0;break;}
}
else
{
for(k=i>j?i-j:j-i,col=k,row=0;col<n;row++,col++)
if(a[col*n+row]==1&&col!=i)
{flag=0;break;}
}
}
if(flag==1) Trial(i+1,n,a);
a[i*n+j]=0;
}
}
5.分治法.簡言之,就是把一個複雜的問題分成兩個或更多的相同或相似的子問題.以此遞迴
int fun(int a[],int n,int x)
{
//功能:求n次多項式的值,a[i]為x的i次方的常數項
if(n==0) return (a[i]*x);
else
return (x*(fun(a,n-1,x)+a[i]));
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//hanoi問題
int count=0;
void move(char x,char y)
{
printf("%c--->%c/n",x,y);
count++;
}
void hanoi(int n,char one,char two,char three)
{
//將n個盤從one座藉助two座,移到three座
if(n==1) move(one,three);
else
{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
遞迴函式在解決複雜演算法方面有很大的作用,比如著名的quicksort就是使用遞迴實現的.用好了它,可以事半公倍的幫你解決問題..