您的位置:首页 > 其它

[BZOJ1085][SCOI2005]骑士精神

2015-07-20 00:09 399 查看
原题地址

A*.

AC code:

#include <cstdio>
int  n,ans;
int  mx[9]={0,-2,-1,1,2,2,1,-1,-2},my[9]={0,1,2,2,1,-1,-2,-2,-1};
char s[6][6];

void build(){
s[1][1]=s[1][2]=s[1][3]=s[1][4]=s[1][5]=s[2][2]=s[2][3]=s[2][4]=s[2][5]=s[3][4]=s[3][5]=s[4][5]='1';
s[2][1]=s[3][1]=s[3][2]=s[4][1]=s[4][2]=s[4][3]=s[4][4]=s[5][1]=s[5][2]=s[5][3]=s[5][4]=s[5][5]='0';
}

int h(char a[6][6]){
int cnt=0;
for(int i=1;i<=5;i++){
for(int j=1;j<=5;j++){
if((i!=3||j!=3)&&a[i][j]!=s[i][j]) cnt++;
}
}
return cnt;
}

void swap(char *a,char *b){
char t=*a;*a=*b;*b=t;
}

void DFS(char a[6][6],int step){
if(step+h(a)>=ans) return ;
else if(!h(a)) ans=step<ans?step:ans;
int x,y;
for(int i=1;i<=5;i++){
for(int j=1;j<=5;j++){
if(a[i][j]=='*'){
x=i;y=j;
break;
}
}
}
for(int i=1;i<=8;i++){
char b[6][6];
int  xx=x+mx[i],yy=y+my[i];
if(xx<1||xx>5||yy<1||yy>5) continue;
for(int j=1;j<=5;j++){
for(int k=1;k<=5;k++) b[j][k]=a[j][k];
}
swap(&b[x][y],&b[xx][yy]);
DFS(b,step+1);
}
}

int main(){
build();
scanf("%d\n",&n);
while(n--){
char map[6][6];
for(int i=1;i<=5;i++){
for(int j=1;j<=5;j++) scanf("%c",&map[i][j]);
scanf("\n");
}
ans=16;
DFS(map,0);
if(ans==16) printf("-1\n");
else printf("%d\n",ans);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: