/*
回溯法求解hamilton回路问题
int n; 顶点个数
int x[n]; hamilton回路上的顶点编号
bool c[n][n]; 图的邻接矩阵
bool s[n]; 若对应顶点已处于搜索路径上则为真
*/
void CBacktrack::hamilton(int n, int x[], bool c[][5])
{
int i,k;
bool *s=new bool[n];
for(i=0;i<n;i++)
{
x[i]=-1;
s[i]=false;
}
k=1;
s[0]=true;
x[0]=0;
while(k>=0)
{
x[k]=x[k]+1;
while(x[k]<n)
{
if((!s[x[k]]) && c[x[k-1]][x[k]])
break;
else
x[k]=x[k]+1;
}
if((x[k]<n) && (k!=n-1))
{
s[x[k]]=true;
k=k+1;
}
else if((x[k]<n) && (k==n-1) && (c[x[k]][x[0]]))
break;
else
{
x[k]=-1;
k=k-1;
s[x[k]]=false;
}
}
delete []s;
s=NULL;
}
void main()
{
/////////////////////////////////////////////
//////// 回溯法求解n皇后问题 ////////////
int x[5]; //x[1……5-1]
const int n=5;
bool c[n][n]={{0,1,0,1,0},{1,0,1,1,1},{0,1,0,1,1},{1,1,1,0,1},{0,1,1,1,0}};
CBacktrack m_Backtrack;
m_Backtrack.hamilton(n,x,c);
for(int i=0;i<n;i++)
cout<<x[i]<<” “;
getchar();
return 0;
}