错误 expression cannot be evaluated 不会改了。。。请教。。
改了好久都不对求租各位大神啊~~#include "stdio.h"
#include "conio.h"
#include <malloc.h>
#include <math.h>
struct bsm
{
int step;
int flag;
int dir;
int data[9];
struct bsm *parent;
struct bsm *suns[4];
int zeroset;
int weight;
};
struct bsm *status[1000];
struct bsm *goal1;
struct bsm *goal2;
void setnew();
void insert();
int judge();
int weight();
int search();
int sp=0;//栈指针
int cp=0;
int goal[9];
int search(int m)
{
int i;
for(i=0;i<9;i++)
if(m==goal[i])
return i;
return 3;
}
int weight(int a[])
{
int i,adr,d1=0;
for(i=0;i<9;i++)
if(a[i]!=0)
{ adr=search(a[i]);
d1+=abs(i/3-adr/3)+abs(i%3-adr%3);
}
return d1;
}
void insert()
{ //i= 0 1 2 3 方向为上 左 右 下 即数组中zero-3 -1 +1 +3
struct bsm *p;
struct bsm *q;
int i,j,v,c,m,n,d2;
p=status[cp-1];
printf("%d",cp);
for(i=0;i<9;i++)printf("%d",p->data[i]);
if(p->weight==0)
{
goal2=goal1=p;
return;
}
c=p->zeroset/3;
v=p->zeroset%3;
for(i=0;i<4;i++)
if(i!=(3-p->dir))
{
switch(i)
{
case 0:c--;break;
case 1:c++;break;
case 2:v--;break;
case 3:v++;break;
}
if(c>=0&&c<3&&v>=0&&v<3)
{
q=(struct bsm *)malloc(sizeof (struct bsm));
if(!q)
{
printf("fail to malloc !");
return ;
}
p->suns[i]=q;
q->flag=0;
q->dir=i;
m=q->zeroset=3*c+v;
q->step=p->step+1;
for(j=0;j<9;j++)
{
q->data[j]=p->data[j];
}
n=q->data[m];
q->data[m]=0;
q->data[p->zeroset]=n;
q->parent=p;
q->weight=weight(q->data);
for(d2=0;d2<4;d2++)
{
q->suns[d2]=0;
}
status[sp]=q;
sp++;
}
cp++;
}
insert();
}
int judge()
{
int g,s,add=0;
int i,j;
for(i=1;i<9;i++) //判别方法是:
// 以数组为一维的举例子.
//将八数码的一个结点表示成一个数组a[9],空格用0表示,设临时函数p(x)定义为:x数所在位置前面的数比x小的数的个数,
//其中0空格不算在之内,那设目标状态为b[9],那r=sigma(p(x)) sigma()表示取所有的x:1-8并求和,
//那对于初始状态a[9],t=sigma(p(x)),如果r和t同为奇数或者同为偶数,那么该状态有解,否则无解。
for(j=0;j<i;j++)
{
if(status[sp-1]->data[i]!=0&&status[sp-1]->data[i]>status[sp-1]->data[j])s++;
if(goal[i]!=0&&goal[i]>goal[j])g++;
}
if(s%2==g%2)
return 1;
return 0;
}
void setnew()
{
int i=0;
struct bsm *head;
head=(struct bsm *)malloc(sizeof (struct bsm));
if(!head)
{
printf("fail to malloc !");
return ;
}
head->dir=0;
head->step=0;
head->flag=1;
printf("please input start num");
for(i=0;i<9;i++)
{
scanf("%d",&head->data[i]);
if(head->data[i]==0)head->zeroset=i;
}
for(i=0;i<4;i++)
{
head->suns[i]=0;
}
head->weight=weight(head->data);
status[sp]=head;
}
void main(void)
{
int i;
printf("please input goal num");
for(i=0;i<9;i++)
{
scanf("%d",&goal[i]);
}
setnew();
sp++;cp++;
if(judge()==1)
{
insert();
while(goal1->parent!=0)
{
goal1->flag=1;
goal1=goal1->parent;
}
do
{
for(i=0;i<9;i++)
{
printf("%2d",goal1->data[i]);
if(i%3==2)printf("\n");
}
for(i=0;i<4;i++)
{
if(goal1->suns[i]->flag==1)goal1=goal1->suns[i];
}
}while(goal1==goal2);
}
else printf("can not reach");
}