搜索真的理论上能解决所有问题,特别是对于数据量小的题目,继续练习,为DP做准备
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define Max 9
int adj[35][35];
int stop[Max],moved[Max],min,n,k;
int cmp(const void *a,const void *b)
{
return *(int *)a-*(int *)b>0?-1:1;
}
void dfs(int ,int,int );
int main()
{
int i,j;
while(scanf("%d",&n)&&n)
{
memset(moved,0,sizeof(moved));
min=60000;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&adj[i][j]);
scanf("%d",&k);
for(i=0;i<k;i++)
scanf("%d",&stop[i]);
qsort(stop,k,sizeof(stop[0]),cmp);
dfs(0,0,0);
printf("%d\n",min);
}
return 0;
}
void dfs(int start,int sum,int num)
{
int i;
if(num==k)
{
if(sum<min) min=sum;
return ;
}
for(i=0;i<k;i++)
{
if(!moved[i])
{
moved[i]=1;
dfs(stop[i],sum+adj[start][stop[i]],num+1);
moved[i]=0;
}
}
}