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 <stdlib.h>
#include <math.h>

#define N 3
#define N2 9
#define NMAX 500001

int head = 0,tail = 0;
int V[NMAX];
int dx[4] = {-1,0,1,0};
int dy[4] = {0,-1,0,1};

struct Puzz{
  int f[N2];
  int space;
  int path;
};

struct Puzz Q[NMAX];

void enqueue(struct Puzz x){
  
  int next = (tail + 1) % NMAX;
  Q[tail] = x;
  tail = next;
}

struct Puzz dequeue(void){
  struct Puzz temp;
  temp = Q[head];
  head = (head + 1) % NMAX;
  return temp;
}
int _Sort(struct Puzz x){
  int i,j,key,cnt,n = 0;

  for(i = 0,key = 1;i < N2;key *= ++i){
    for(j = 0,cnt = 0;j < i;j++){
      if(x.f[j] < x.f[i]){
	cnt++;
      }
    }
    n += cnt * key;
  }
  return n;
}

int isTarget(struct Puzz x){
  int i;

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

int bfs(struct Puzz s){
  int r,sx,sy,tx,ty,temp;
  struct Puzz u,v;

  s.path = 0;
  enqueue(s);
  V[_Sort(s)] = 1;

  while(head != tail){
    u = dequeue();
    if(isTarget(u) == 1){
      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;
      temp = v.f[u.space];
      v.f[u.space] = v.f[tx * N + ty];
      v.f[tx * N + ty] = temp;
      v.space = tx * N + ty;
      if(V[_Sort(v)] != 1){
	V[_Sort(v)] = 1;
	v.path++;
	enqueue(v);
      }
    }
  }

  return -1;
}

int main(void){

  int i,ans;
  struct Puzz in;

  for(i = 0;i < N2;i++){
    scanf("%d",&in.f[i]);
    if(in.f[i] == 0){
      in.f[i] = N2;
      in.space = i;
    }
  }

  ans = bfs(in);
  printf("%d\n",ans);

  return 0;
}