题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2918
这题步数最多只有9步,果断IDA*,因为每步会改变四个数字的曼哈顿距离,所以h()构造为 (曼哈顿距离和+3)/4;这题也可以用广搜预处理来写,广搜九层,然后询问时直接输出就好了,但内存肯定要比IDA*大
这题步数最多只有9步,果断IDA*,因为每步会改变四个数字的曼哈顿距离,所以h()构造为 (曼哈顿距离和+3)/4;这题也可以用广搜预处理来写,广搜九层,然后询问时直接输出就好了,但内存肯定要比IDA*大
#include<cstdio>
#include<cstring>
using namespace std;
char maze[5][5];
void cvrAc(){
char tmp=maze[0][0];
maze[0][0]=maze[1][0];
maze[1][0]=maze[1][1];
maze[1][1]=maze[0][1];
maze[0][1]=tmp;
}
void cvrAr(){
char tmp=maze[0][0];
maze[0][0]=maze[0][1];
maze[0][1]=maze[1][1];
maze[1][1]=maze[1][0];
maze[1][0]=tmp;
}
void cvrBc(){
char tmp=maze[0][1];
maze[0][1]=maze[1][1];
maze[1][1]=maze[1][2];
maze[1][2]=maze[0][2];
maze[0][2]=tmp;
}
void cvrBr(){
char tmp=maze[0][1];
maze[0][1]=maze[0][2];
maze[0][2]=maze[1][2];
maze[1][2]=maze[1][1];
maze[1][1]=tmp;
}
void cvrCc(){
char tmp=maze[1][0];
maze[1][0]=maze[2][0];
maze[2][0]=maze[2][1];
maze[2][1]=maze[1][1];
maze[1][1]=tmp;
}
void cvrCr(){
char tmp=maze[1][0];
maze[1][0]=maze[1][1];
maze[1][1]=maze[2][1];
maze[2][1]=maze[2][0];
maze[2][0]=tmp;
}
void cvrDc(){
char tmp=maze[1][1];
maze[1][1]=maze[2][1];
maze[2][1]=maze[2][2];
maze[2][2]=maze[1][2];
maze[1][2]=tmp;
}
void cvrDr(){
char tmp=maze[1][1];
maze[1][1]=maze[1][2];
maze[1][2]=maze[2][2];
maze[2][2]=maze[2][1];
maze[2][1]=tmp;
}
const int pos[][2]={{0,0},{0,1},{0,2},{1,0},{1,1},{1,2},{2,0},{2,1},{2,2}};
inline int ABS(int x){
if(x<0) return-x;
else return x;
}
int h(){
int val=0;
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
int c=maze[i][j]-'1';
val+=ABS(pos[c][0]-i)+ABS(pos[c][1]-j);
}
}
return val;
}
int deep;
bool dfs(int d){
if(h()==0) return true;
if((h()+3)/4+d>deep) return false;
cvrAc();
if(dfs(d+1)) return true;
cvrAr();
cvrAr();
if(dfs(d+1)) return true;
cvrAc();
cvrBc();
if(dfs(d+1)) return true;
cvrBr();
cvrBr();
if(dfs(d+1)) return true;
cvrBc();
cvrCc();
if(dfs(d+1)) return true;
cvrCr();
cvrCr();
if(dfs(d+1)) return true;
cvrCc();
cvrDc();
if(dfs(d+1)) return true;
cvrDr();
cvrDr();
if(dfs(d+1)) return true;
cvrDc();
return false;
}
char str[12];
int main(){
int cas=0;
while(~scanf("%s",str),strcmp(str,"0000000000")){
int mmax=str[0]-'0';
int p=1;
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
maze[i][j]=str[p++];
}
}
deep=0;
bool flag=false;
while(deep<=mmax){
if(dfs(0)){
flag=true;
break;
}
deep++;
}
printf("%d. ",++cas);
if(flag) printf("%d\n",deep);
else puts("-1");
}
return 0;
}