八数码程序运行不对
是我写的一个用A算法解八数码的问题,编译通过了,但运行有些结果不对,麻烦各位大侠帮我找一下错#include<stdio.h>
int E=0;
int B[9]={1,2,3,8,0,4,7,6,5};//目标状态
void produce(int a[200][14],int i,int j);
void sort(int a[200][14],int i);
void output(int a[200][14],int j);
main(){
int N=0,c;
int A[200][14]={{2,8,3,1,0,4,7,6,5,0,3,3,4,5}};//初始状态
for(;A[N][10];){//A[N][10]存的是好h(n)值,当为0时循环结束
c=A[N][12];//A[N][12]存的是零的位置
produce(A,N,c);//产生节点
N++;
sort(A,N);//排列节点,下一个节点保持是F(N)最小的节点
}
output(A,N);
}
void produce(int a[200][14],int i,int j){
int p,q;
//up
if((j>2)&&(a[i][13]!=1)){
E++;
for(p=0;p<=8;p++){a[E][p]=a[i][p];}
a[E][j-3]=0;
a[E][j]=a[i][j-3];
a[E][9]=a[i][9]+1;//当前节点的深度
p=0;q=0;
for(;p<=8;p++){
if((a[E][p]!=B[p])&&(a[E][p]!=0)){
q++;}
}
a[E][10]=q;//h(n)的值
a[E][11]=a[E][9]+a[E][10];//f(n)的值
a[E][12]=j-3;//0的位置
a[E][13]=0;//该节点是由上移得到的,0代表上,1代表下,2代表左,3代表右
}
//down
if((j<=5)&&(a[i][13]!=0)){
E++;
for(p=0;p<=8;p++){a[E][p]=a[i][p];}
a[E][j+3]=0;
a[E][j]=a[i][j+3];
a[E][9]=a[i][9]+1;
p=0;q=0;
for(;p<=8;p++){if((a[E][p]!=B[p])&&(a[E][p]!=0)){q++;}}
a[E][10]=q;
a[E][11]=a[E][9]+a[E][10];
a[E][12]=j+3;
a[E][13]=1;
//left
if((j!=0)&&(j!=3)&&(j!=6)&&(a[i][13]!=3)){
E++;
for(p=0;p<=8;p++){a[E][p]=a[i][p];}
a[E][j-1]=0;
a[E][j]=a[i][j-1];
a[E][9]=a[i][9]+1;
p=0;q=0;
for(;p<=8;p++){if((a[E][p]!=B[p])&&(a[E][p]!=0)){q++;}}
a[E][10]=q;
a[E][11]=a[E][9]+a[E][10];
a[E][12]=j-1;
a[E][13]=2;
}
//right
if((j!=2)&&(j!=5)&&(j!=8)&&(a[i][13]!=2)){
E++;
for(p=0;p<=8;p++){a[E][p]=a[i][p];}
a[E][j+1]=0;
a[E][j]=a[i][j+1];
a[E][9]=a[i][9]+1;
p=0;q=0;
for(;p<=8;p++){if((a[E][p]!=B[p])&&(a[E][p]!=0)){q++;}}
a[E][10]=q;
a[E][11]=a[E][9]+a[E][10];
a[E][12]=j+1;
a[E][13]=3;
}
}
}
void sort(int a[200][14],int i){
int j=i;
int t,x;
int min=a[i][11];
for(i=i+1;i<=E;i++){
if(a[i][11]<=min){
for(x=0;x<=13;x++){
t=a[j][x];
a[j][x]=a[i][x];
a[i][x]=t;}}
}
}
void output(int a[20][14],int j){
int p,q;
for(p=0;p<=j;p++){
for(q=0;q<=8;q++){
printf("%d %d %d",a[p][q],a[p][q+1],a[p][q+2]);
printf("\n");
q=q+2;}
printf("\n");
printf("\n");
}
}