
Untitled
By: a guest on
May 7th, 2012 | syntax:
C++ | size: 2.42 KB | hits: 19 | expires: Never
#include<iostream>
#include<string>
#include<cstring>
#include<sstream>
#include<cctype>
#include<string.h>
#include<algorithm>
#include<cmath>
#include<stack>
#include<fstream>
#include<cstdlib>
#include<vector>
#include<map>
#include<utility>
#include<iomanip>
#include<queue>
#define eps 1e-9
#define max(a,b) ((a>b)?a:b)
#define min(a,b) ((a<b)?a:b)
#define pb(a) push_back(a)
#define mp(a,b) make_pair(a,b)
#define pi acos(-1.0)
#define SET(a) memset(a,-1,sizeof a)
#define CLR(a) memset(a,0,sizeof a)
#define inf 2000000000
#define MOD 1000000007
using namespace std;
struct node
{
int x,y;
};
long long dp[16+2][65535+5];
int dis[1000+2][1000+2],res[1000+2][1000+2];
bool vis[1000+2][1000+2];
int dx[8]={-1,-2,-2,-1,1,2, 2, 1};
int dy[8]={-2,-1, 1, 2,2,1,-1,-2};
int n,k,st,X[16+5],Y[16+5];
long long func(int prev,int bit)
{
if(bit==((1<<k)-1))
{
return dp[prev][bit]=res[abs(X[prev]-X[st])][abs(Y[prev]-Y[st])];
}
if(dp[prev][bit]!=-1) return dp[prev][bit];
long long ret=inf;
for(int i=0;i<k;i++)
{
if((bit&(1<<i))==0)
{
ret=min(ret,res[abs(X[prev]-X[i])][abs(Y[prev]-Y[i])]+func(i,bit|(1<<i)));
}
}
return dp[prev][bit]=ret;
}
int main()
{
int t,kk=1;
node N,U,V;
N.x=N.y=1;
vis[N.x][N.y]=1;
queue<node>q;
q.push(N);
while(!q.empty())
{
U=q.front();
q.pop();
for(int i=0;i<8;i++)
{
V.x=U.x+dx[i];
V.y=U.y+dy[i];
if(V.x>=1 && V.x<=1000 && V.y>=1 && V.y<=1000 && !vis[V.x][V.y])
{
vis[V.x][V.y]=1;
res[abs(V.x-1)][abs(V.y-1)]=dis[V.x][V.y]=dis[U.x][U.y]+1;
q.push(V);
}
}
}
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&k);
CLR(X);
CLR(Y);
for(int i=0;i<k;i++)
{
scanf("%d%d",&N.x,&N.y);
X[i]=N.x;
Y[i]=N.y;
}
printf("Case %d: ",kk++);
if(k==1) {printf("0\n");continue;}
long long ans=inf;
if(n==4) res[3][0]=res[0][3]=5;
else res[3][0]=res[0][3]=3;
SET(dp);
for(st=0;st<k;st++)
{
ans=min(ans,func(st,(1<<st)));
}
if(ans==inf) ans=0;
printf("%lld\n",ans);
}
return 0;
}