n皇后
``
#include<bits/stdc++.h>
int cnt=0;
using namespace std;
int a[100];
int cno(int t)
{
for(int i=0;i<t;i++)
{
if(a[i]==a[t])
return 0;
if(t-i==abs(a[t]-a[i]))
return 0;
}
return 1;
}
void dfs(int t)
{
if(t==8)
{
for(int i=0;i<8;i++)
cout<<a[i]<<' ';
cnt++;
putchar('\n');
return;
}
for(int i=0;i<8;i++)
{
a[t]=i;
if(cno(t))
dfs(t+1);
}
}
int main()
{
dfs(0);
cout<<cnt;
return 0;
}
矩阵连乘求最小计算量
#include<bits/stdc++.h>
using namespace std;
int a[10][10];
int p[7]={30,35,15,5,10,20,25};
int s[10][10];
void cnpo(int *p,int n,int m)
{
for(int i=1;i<=m;i++)
a[i][i]=0;
for(int r=2;r<=m;r++)
{
for(int i=1;i<=m-r+1;i++)
{
int j=r+i-1;
a[i][j]=a[i+1][j]+p[i-1]*p[i]*p[j];
s[i][j]=i;
for(int k=i+1;k<j;k++)
{
int temp=a[i][k]+a[k+1][j]+p[i-1]*p[k]*p[j];
if(temp<a[i][j])
{
a[i][j]=temp;
s[i][j]=k;
}
}
}
}
cout<<a[1][m]<<endl;
}
void nuca(int n,int m)
{
if(n==m)
return;
nuca(n,s[n][m]);
nuca(s[n][m]+1,m);
cout<<n<<','<<s[n][m]<<"and"<<s[n][m]+1<<','<<m<<endl;
}
int main()
{
cnpo(p,1,6);
nuca(1,6);
return 0;
}
全排列问题
#include<bits/stdc++.h>
int cnt=0;
using namespace std;
int a[100];
void dop(int a[],int begin,int end)
{
if(begin==end)
{
for(int i=0;i<5;i++)
cout<<a[i]<<' ';
cout<<endl;
return;
}
for(int i=begin;i<=end;i++) ///以每一个数字作为起点
{
int temp=a[begin];
a[begin]=a[i];
a[i]=temp;
dop(a,begin+1,end);
temp=a[begin];//换回去
a[begin]=a[i];
a[i]=temp;
}
}
int main()
{
int a[]={1,2,3,4,5};
dop(a,0,4);
return 0;
}