您的位置:首页 > 其它

poj 1178 Camelot 枚举

2015-12-04 09:08 363 查看
//poj 1178
//sep9
#include <iostream>
using namespace std;
char s[132];
int da[8][2]={
{-2,-1},{-2,1},{-1,-2},{-1,2},
{2,1},{2,-1},{1,2},{1,-2}
};
int db[8][2]={
{-1,-1},{-1,0},{-1,-1},{0,-1},
{0,1},{1,-1},{1,0},{1,1}
};
int a[80][80],b[80][80],knight[80],king;

bool judge(int i,int j)
{
if(i>=0&&i<8&&j>=0&&j<8)
return true;
return false;
}

void init()
{
for(int i=0;i<64;++i)
for(int j=0;j<64;++j)
if(i==j) a[i][j]=b[i][j]=0;
else a[i][j]=b[i][j]=1024;
for(int i=0;i<8;++i)
for(int j=0;j<8;++j)
for(int k=0;k<8;++k){
int x=i+da[k][0];
int y=j+da[k][1];
int xx=i+db[k][0];
int yy=j+db[k][1];
if(judge(x,y))
a[i+8*j][x+8*y]=1;
if(judge(xx,yy))
b[i+8*j][xx+8*yy]=1;
}
for(int k=0;k<64;++k)
for(int i=0;i<64;++i)
for(int j=0;j<64;++j){
a[i][j]=min(a[i][j],a[i][k]+a[k][j]);
b[i][j]=min(b[i][j],b[i][k]+b[k][j]);
}

}

int main()
{
init();
while(scanf("%s",s)==1){
int n=strlen(s);
king=s[0]-'A'+8*(s[1]-'1');
int cnt=0;
for(int i=2;i<n;i+=2){
int x=s[i+1]-'1';
int y=s[i]-'A';
knight[cnt++]=8*x+y;
}
int ans=INT_MAX;
for(int i=0;i<64;++i)
for(int j=0;j<64;++j)
for(int k=0;k<cnt;++k){
int sum=0;
for(int l=0;l<cnt;++l){
if(l==k) continue;
sum+=a[knight[l]][i];
}
sum+=a[knight[k]][j]+a[j][i]+b[king][j];
ans=min(ans,sum);
}
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj 算法