初学编程,八数码C语言深度搜索程序编译通不过,求高手们帮帮忙--急

#include<stdio.h>#include<math.h>#include<stdlib.h>#definemax_layer5/*最大扩展层数宏定义*/#def... #include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define max_layer 5 /*最大扩展层数宏定义*/
#define true 1
#define fail 0
#define null 0
struct link
{
int data[3][3];/*八数码状态*/
int layer; /*该节点的层数*/
struct link *next;
struct link *prior;
};
struct link *close_head; /*Close表的根节点*/
struct link *open_head; /*Open表的根节点*/

/*****************************************************/
/* 函数名称:output() */
/* 功能说明:输出指针P指向的节点的数据 */
/****************************************************/
void output(struct link *p)
{
int i,j;
while(p!=NULL)
{for(i=0;i<3;i++) /*行输出控制*/
{
for(j=0;j<3;j++) /*列输出控制*/
printf("%d ",p->data[i][j]);/*输出i行j列上的数据*/
printf("\n"); /*每输出一行数据,回车换行*/
}
printf("---------------------\n"); /*输出一条横线以区分屏幕上其他节点数据*/
p--;
}
/* 函数名称:compare*/
/* 功能说明:将指针Operate指向的节点中的数据与二维数组dest中的数据进行比较*/
int compare(struct link *q,int dest[3][3])
{
int i,j,count=0;
for(i=0;i<3;i++) /*行比较控制*/
{
for(j=0;j<3;j++) /*列比较控制*/
{
if(q->data[i][j]==dest[i][j])/*比较i行j列上的数据*/
count++; /*计数器加一*/
else /*只要发现有一个数据不相等*/
{
/*即返回 fail,宣告比较失败*/
j=3; /*强制推出for循环*/
i=3; /*强制推出for循环*/
return 0;
}
}
}
if(count==9)/*相等的数据的个数与维数平方相等*/
return 1; /*表示数据都对应相等,返回true */
}
程序太长,其余的见四楼,谢谢啦
展开
 我来答
希声和寡
推荐于2016-12-03 · TA获得超过2.6万个赞
知道大有可为答主
回答量:6437
采纳率:0%
帮助的人:4126万
展开全部
帮你改好了,一共有8个错误:
主要是:
1. output()函数少了一个花括号
2. 一些该传地址的地方传了值
3. 有一个变量没定义:eight()函数中的open_link_point,我先改为open_point了

下面是改后的代码,改的地方我用/////////////注明了。
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define max_layer 5 /*嵟戝?揥?悢岹掕?*/
#define true 1
#define fail 0
#define null 0
struct link
{
int data[3][3];/*敧悢?忬?*/
int layer; /*??揰揑?悢*/
struct link *next;
struct link *prior;
};
struct link *close_head; /*Close昞揑崻?揰*/
struct link *open_head; /*Open昞揑崻?揰*/

/*****************************************************/
/* 敓悢柤徧丗output() */
/* 岟擞?柧丗?弌巜?P巜岦揑?揰揑悢悩 */
/****************************************************/
void output(struct link *p)
{
int i,j;
while(p!=NULL)
{for(i=0;i<3;i++) /*岘?弌峊惂*/
{
for(j=0;j<3;j++) /*楍?弌峊惂*/
printf("%d ",p->data[i][j]);/*?弌i岘j楍忋揑悢悩*/
printf("\n"); /*??弌堦岘悢悩丆夞??岘*/
}
printf("---------------------\n"); /*?弌堦忦墶?埲嬫暘洜枊忋懘懠?揰悢悩*/
p--;
}
}////////////////////1
/* 敓悢柤徧丗compare*/
/* 岟擞?柧丗彨巜?Operate巜岦揑?揰拞揑悢悩梌择?悢?dest拞揑悢悩?岘斾?*/
int compare(struct link *q,int dest[3][3])
{
int i,j,count=0;
for(i=0;i<3;i++) /*岘斾?峊惂*/
{
for(j=0;j<3;j++) /*楍斾?峊惂*/
{
if(q->data[i][j]==dest[i][j])/*斾?i岘j楍忋揑悢悩*/
count++; /*?悢婍壛堦*/
else /*扅梫??桳堦槩悢悩晄憡摍*/
{
/*懄晓夞 fail丆愰崘斾?幐?*/
j=3; /*?惂悇弌for弞?*/
i=3; /*?惂悇弌for弞?*/
return 0;
}
}
}
if(count==9)/*憡摍揑悢悩揑槩悢梌?悢暯曽憡摍*/
return 1; /*昞帵悢悩搒??憡摍丆晓夞true */
}

/* 敓悢柤徧丗eight()*/
/* 岟擞?柧丗捠?怺搙?揥揑曽帏漄弌敧悢???樃弶峦忬?摓栚?忬?揑楬宎 */
int eight(struct link *open_head,int dest[3][3])
{
int i,j,zero_x,zero_y; /*0揑墶嵖?丆0揑?嵖?*/
struct link *new_point; /*?栋open昞揑堦槩??巜?*/
struct link *open_point=open_head;/*open昞憖嶌巜?1*/ ////////////2
struct link *close_point;
while(open_point!=NULL) ///////////////////3open_link_point
{
close_point=open_point;
open_point->prior->next=NULL;
open_point--;
if(compare(close_point,dest)==1)
{
printf("find solution");
output(close_point);
return 1;
}
else
{
if(close_point->layer>max_layer)
{
close_point->next=open_point; ////////////4
close_point++;
}
else
{
for(i=0;i<3;i++)/*?庢0揑嵖?*/
{
for(j=0;j<3;j++)
{
if(close_point->data[i][j]==0) /*data or dest*/
{
zero_x=i;/*墶嵖?*/
zero_y=j;/*?嵖?*/
j=3; /*?惂戅弌弞?*/
i=3; /*?惂戅弌弞?*/
}
}
}
if((zero_x-1)>=0)/*墲忋堏*/
{ /*怽?撪懚嬻?*/
new_point=(struct link *)malloc(sizeof(struct link));
for(i=0;i<3;i++)/*?怴?揥揑?揰??*/
{
for(j=0;j<3;j++)
new_point->data[i][j]=close_point->data[i][j];
}
new_point->data[zero_x][zero_y]=new_point->data[zero_x-1][zero_y];
new_point->data[zero_x-1][zero_y]=0;
open_point->next=new_point; ////////////////5
open_point++;
}
if((zero_x+1)<3)/*墲压堏*/
{ /*怽?撪懚嬻?*/
new_point=(struct link *)malloc(sizeof(struct link));
for(i=0;i<3;i++)/*?怴?揥揑?揰??*/
{
for(j=0;j<3;j++)
new_point->data[i][j]=close_point->data[i][j];
}
new_point->data[zero_x][zero_y]=new_point->data[zero_x+1][zero_y];
new_point->data[zero_x+1][zero_y]=0;
open_point->next=new_point;///////////////6
open_point++;
}
if((zero_y-1)>=0)/*0墲塃堏*/
{ /*怽?撪懚嬻?*/
new_point=(struct link *)malloc(sizeof(struct link));
for(i=0;i<3;i++)/*?怴?揥揑?揰??*/
{
for(j=0;j<3;j++)
new_point->data[i][j]=close_point->data[i][j];
}
new_point->data[zero_x][zero_y]=new_point->data[zero_x][zero_y-1];
new_point->data[zero_x][zero_y-1]=0;
open_point->next=new_point;/////////////////////// 7
open_point++;
}
if((zero_y+1)<3)/*0墲嵍堏*/
{ /*怽?撪懚嬻?*/
new_point=(struct link *)malloc(sizeof(struct link));
for(i=0;i<3;i++)/*?怴?揥揑?揰??*/
{
for(j=0;j<3;j++)
new_point->data[i][j]=close_point->data[i][j];
}
new_point->data[zero_x][zero_y]=new_point->data[zero_x][zero_y+1];
new_point->data[zero_x][zero_y+1]=0;
open_point->next=new_point;////////////////////////8
open_point++;
}
}
}
}
if(open_point=NULL)
printf("no solution");
}
/* 敓悢柤徧丗main*/
void main()
{
int i,j;
int destination[3][3]; /*择?悢?丆梡埲懚曻栚?忬?*/
struct link *open_head=(struct link *)malloc(sizeof(struct link)); /*怽?堦槩?揰嬻?*
printf("The max dimention is 3"); /*采恽梡?敧悢?揑?悢戝雕*/
printf("Please input the initial state of <eight puzzle>:\n");
for(i=0;i<3;i++) /*?庢敧悢?揑弶峦忬?*/
{
for(j=0;j<3;j++)
scanf("%d",&open_head->data[i][j]); /*攃弶峦忬?懚曻嵼怽?揑?揰拞丆懄Open昞*/
}
printf("Please input the final state of <eight puzzle>:\n");
for(i=0;i<3;i++) /*?庢敧悢?揑栚?忬?*/
{
for(j=0;j<3;j++)
scanf("%d",&destination[i][j]); /*攃栚?忬?悢悩懚曻嵼destination[][]拞*/
}
open_head->layer=0; /*弶峦壔弶峦忬??揰揑?悢?0丆昞帵???岘?揥 */
eight(open_head,destination);
}
在年琴0V
2008-12-21
知道答主
回答量:14
采纳率:0%
帮助的人:0
展开全部
帮帮忙吧,22号就要交了,问题太长,重新注册了一个号
/* 函数名称:eight()*/
/* 功能说明:通过深度扩展的方式找出八数码问题从初始状态到目标状态的路径 */
int eight(struct link *open_head,int dest[3][3])
{
int i,j,zero_x,zero_y; /*0的横坐标,0的纵坐标*/
struct link *new_point; /*处理open表的一个临时指针*/
struct link *open_point=*open_head;/*open表操作指针1*/
struct link *close_point;
while(open_link_point!=NULL)
{
close_point=open_point;
open_point->prior->next=NULL;
open_point--;
if(compare(close_point,dest)==1)
{
printf("find solution");
output(close_point);
return 1;
}
else
{
if(close_point->layer>max_layer)
{
close_point->next=*open_point;
close_point++;
}
else
{
for(i=0;i<3;i++)/*获取0的坐标*/
{
for(j=0;j<3;j++)
{
if(close_point->data[i][j]==0) /*data or dest*/
{
zero_x=i;/*横坐标*/
zero_y=j;/*纵坐标*/
j=3; /*强制退出循环*/
i=3; /*强制退出循环*/
}
}
}
if((zero_x-1)>=0)/*往上移*/
{ /*申请内存空间*/
new_point=(struct link *)malloc(sizeof(struct link));
for(i=0;i<3;i++)/*对新扩展的节点赋值*/
{
for(j=0;j<3;j++)
new_point->data[i][j]=close_point->data[i][j];
}
new_point->data[zero_x][zero_y]=new_point->data[zero_x-1][zero_y];
new_point->data[zero_x-1][zero_y]=0;
open_point->next=*new_point;
open_point++;
}
if((zero_x+1)<3)/*往下移*/
{ /*申请内存空间*/
new_point=(struct link *)malloc(sizeof(struct link));
for(i=0;i<3;i++)/*对新扩展的节点赋值*/
{
for(j=0;j<3;j++)
new_point->data[i][j]=close_point->data[i][j];
}
new_point->data[zero_x][zero_y]=new_point->data[zero_x+1][zero_y];
new_point->data[zero_x+1][zero_y]=0;
open_point->next=*new_point;
open_point++;
}
if((zero_y-1)>=0)/*0往右移*/
{ /*申请内存空间*/
new_point=(struct link *)malloc(sizeof(struct link));
for(i=0;i<3;i++)/*对新扩展的节点赋值*/
{
for(j=0;j<3;j++)
new_point->data[i][j]=close_point->data[i][j];
}
new_point->data[zero_x][zero_y]=new_point->data[zero_x][zero_y-1];
new_point->data[zero_x][zero_y-1]=0;
open_point->next=*new_point;
open_point++;
}
if((zero_y+1)<3)/*0往左移*/
{ /*申请内存空间*/
new_point=(struct link *)malloc(sizeof(struct link));
for(i=0;i<3;i++)/*对新扩展的节点赋值*/
{
for(j=0;j<3;j++)
new_point->data[i][j]=close_point->data[i][j];
}
new_point->data[zero_x][zero_y]=new_point->data[zero_x][zero_y+1];
new_point->data[zero_x][zero_y+1]=0;
open_point->next=*new_point;
open_point++;
}
}
}
}
if(open_point=NULL)
printf("no solution");
}
/* 函数名称:main*/
void main()
{
int i,j;
int destination[3][3]; /*二维数组,用以存放目标状态*/
struct link *open_head=(struct link *)malloc(sizeof(struct link)); /*申请一个节点空间*
printf("The max dimention is 3"); /*提醒用户八数码的维数大小*/
printf("Please input the initial state of <eight puzzle>:\n");
for(i=0;i<3;i++) /*获取八数码的初始状态*/
{
for(j=0;j<3;j++)
scanf("%d",&open_head->data[i][j]); /*把初始状态存放在申请的节点中,即Open表*/
}
printf("Please input the final state of <eight puzzle>:\n");
for(i=0;i<3;i++) /*获取八数码的目标状态*/
{
for(j=0;j<3;j++)
scanf("%d",&destination[i][j]); /*把目标状态数据存放在destination[][]中*/
}
open_head->layer=0; /*初始化初始状态节点的层数为0,表示还为进行扩展 */
eight(open_head,destination);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
划水送兔健将
2008-12-14 · TA获得超过202个赞
知道答主
回答量:182
采纳率:0%
帮助的人:105万
展开全部
0
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式