Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

8 Puzzle

The goal of the 8 puzzle problem is to complete pieces on $3 \times 3$ cells where one of the cells is empty space.

In this problem, the space is represented by 0 and pieces are represented by integers from 1 to 8 as shown below.

1 3 0
4 2 5
7 8 6

You can move a piece toward the empty space at one step. Your goal is to make the pieces the following configuration in the shortest move (fewest steps).

1 2 3
4 5 6
7 8 0

Write a program which reads an initial state of the puzzle and prints the fewest steps to solve the puzzle.

Input

The $3 \times 3$ integers denoting the pieces or space are given.

Output

Print the fewest steps in a line.

Constraints

There is a solution.

Sample Input

1 3 0
4 2 5
7 8 6

Sample Output

4

Solution in C (judge verdict: Accepted)

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#define N 3
#define N2 9
#define LEN 10000000

typedef struct Puzzle{
  int f[N2];
  int space;
  int path;
} Puzzle ;

int V[LEN];
static const int dx[4] = {-1, 0, 1, 0};
static const int dy[4] = {0, -1, 0, 1};
//static const char dir[4]={'u','l','d','r'};

struct Puzzle Q[LEN];
int head = 0, tail = 0;

void enqueue(Puzzle x){
   Q[tail]=x;
   tail=(tail+1)%LEN;
}

Puzzle dequeue(){
  Puzzle x=Q[head];
  head=(head+1)%LEN;
  return x;
}

int chim(Puzzle p){
  int i, j,muri, count,n=0;
  for(i=0,muri=1;i<N2;muri*=++i){
    for(j=0,count=0;j<i;j++){
      if(p.f[j]<p.f[i])count++;
    }
    n+=count*muri;
  }
  return n;
}

int isTarget(Puzzle p){
  for(int i = 0; i < N2; i++){
  	if(p.f[i] != (i+1)) return 0;
  }
  return 1;
}

int bfs(Puzzle spc){
  struct Puzzle u,v;
  spc.path=0;
  enqueue(spc);
  V[chim(spc)]=1;
  
  while(head != tail){ 
  int sx,sy,tx,ty,z,r;
    u=dequeue();
    if(isTarget(u)){
        return u.path;
    }
     sx=u.space/N;
     sy=u.space%N;
    for(r=0;r<4;r++){
       tx=sx+dx[r];
       ty=sy+dy[r];
      if(tx<0 || ty<0 || tx>=N || ty>= N)continue;
      v=u;
      z=v.f[u.space];
      v.f[u.space]=v.f[tx*N+ty];
      v.f[tx*N+ty]=z;
      v.space=tx*N+ty;
      if(V[chim(v)] != 1){
	V[chim(v)] = 1;
	v.path++;//=dir[r];
	enqueue(v);
      }
    }
  }

  return -1;
}

int main(){
  Puzzle in;
  
  for(int i = 0; i < N2; i++){
    scanf("%d",&in.f[i]);
    if(in.f[i] == 0){
      in.f[i] = N2;
      in.space = i;
    }
  }
int answer;
answer = bfs(in);
printf("%d\n",answer );
return 0;
}