代码如下
#include<stdio.h>
int N,x[100],bestx[100],f,bestf;
int matrix[100][100];
int backtrack(int i);
void swap(int *x,int i,int j);
int main()
{
int i,j;
f=0;bestf=1000;
scanf("%d",&N);
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
scanf("%d",&matrix[i][j]);
for(i=1;i<=N;i++)
x[i]=i;
backtrack(1);
for(i=1;i<=N;i++)
printf("%d",bestx[i]);
printf("/n%d",bestf);
return 0;
}
int backtrack(int i)
{
int j;
if(i>=N+1)
{
bestf=f;
for(j=1;j<=N;j++)
bestx[j]=x[j];
return 0;
}
for(j=i;j<=N;j++)
{
f+=matrix[i][x[j]];
if(f<bestf) //控制递归的条件,剪枝条件;
{
swap(x,i,j);
backtrack(i+1);
swap(x,i,j);
}
f-=matrix[i][x[j]];
}
return 0;
}
void swap(int *x,int i,int j)
{
int t;
t=x[i];
x[i]=x[j];
x[j]=t;
}
总结:
在做此类全排列回鎙题时,要特别注意在回鎙之前和回鎙之后的状态;