急:C语言迷宫问题代码!
# include & ltstdlib.h & gt
# include & ltmalloc.h & gt
结构节点
{
int符号;//ID,0什么都不是,1在开,2在关。
int标志;//标志位0/1,0可以去,1不能去。
int f,g,h;//判断功能
int x,y;//坐标
int old//是否是旧节点,0不是,1是。
};
结构链接
{
节点fnode
链接*下一个;
link * pri
};
链接*打开,*关闭,*最佳节点,*后继,*p,*q,*r,* s;
int maze_flag[7][7]={ {0,1,0,0,0,0},
{0,1,0,1,0,1,0},
{0,1,0,0,0,1,0},
{0,1,0,1,0,1,0},
{0,0,0,1,0,0,0},
{1,1,0,1,0,1,0},
{0,0,0,0,0,1,0}};//代表迷宫的数组,0可以走,1不能走。
节点迷宫[7][7];
Int judge(node n)//判断函数,判断node n是否可以去。
{
if(n.flag==1)
返回(1);
其他
return(0);
}
Void in_open(node n)//将n个节点放入打开的表中。
{
p =开;
while(p->;下一个!=打开)
{
if(n . f & gt;= p->;f节点)
{
p->;下一个-& gt;pri =(link *)malloc(sizeof(link));
p->;下一个-& gt;优先级-& gt;pri = p;
p = p-& gt;接下来;
p->;优先级-& gt;next = p;
p->;优先级-& gt;优先级-& gt;next = p-& gt;pri
p = p-& gt;pri
p->;fnode . flag = n . flag;
p->;fnode . f = n . f;
p->;fnode . g = n . g;
p->;fnode . h = n . h;
p->;fnode . x = n . x;
p->;fnode . y = n . y;
p->;fnode . old = n . old;
p->;fnode . sign = n . sign = 1;
}
其他
p = p-& gt;接下来;
}
打开->;pri =(link *)malloc(sizeof(link));
打开->;优先级-& gt;pri = p;
打开->;优先级-& gt;下一个=打开;
p->;下一个=打开-& gt;pri
p = p-& gt;接下来;
p->;fnode . flag = n . flag;
p->;fnode . f = n . f;
p->;fnode . g = n . g;
p->;fnode . h = n . h;
p->;fnode . x = n . x;
p->;fnode . y = n . y;
p->;fnode . old = n . old;
p->;fnode . sign = n . sign = 1;
}
Void out_open(node n)//将n节点移出打开的表。
{
p =开;
while(p->;下一个!=打开)
{
if(n . f = p-& gt;f节点)
{
link * p 1;
p 1 = p->;接下来;
p->;next = p-& gt;下一个-& gt;接下来;
p->;下一个-& gt;pri = p;
免费(p 1);
n . sign = 0;
}
其他
p = p-& gt;接下来;
}
}
Void in_closed(node n)//将n个节点放入关闭的表中。
{
while(q->;下一个!=关闭)
{
if(n . f & gt;= q->;f节点)
{
q->;下一个-& gt;pri =(link *)malloc(sizeof(link));
q->;下一个-& gt;优先级-& gt;pri = q;
q = q-& gt;接下来;
q->;优先级-& gt;next = p;
q->;优先级-& gt;优先级-& gt;next = q-& gt;pri
q = q-& gt;pri
q->;fnode . flag = n . flag;
q->;fnode . f = n . f;
q->;fnode . g = n . g;
q->;fnode . h = n . h;
q->;fnode . x = n . x;
q->;fnode . y = n . y;
q->;fnode . old = n . old;
q->;fnode . sign = n . sign = 2;
}
其他
q = q-& gt;接下来;
}
关闭-& gt;pri =(link *)malloc(sizeof(link));
关闭-& gt;优先级-& gt;pri = q;
关闭-& gt;优先级-& gt;下一个=关闭;
q->;next = closed-& gt;pri
q = q-& gt;接下来;
q->;fnode . flag = n . flag;
q->;fnode . f = n . f;
q->;fnode . g = n . g;
q->;fnode . h = n . h;
q->;fnode . x = n . x;
q->;fnode . y = n . y;
q->;fnode . old = n . old;
q->;fnode . sign = n . sign = 2;
}
Void out_closed(node n)//将n节点移出关闭的表。
{
q =关闭;
while(q->;下一个!=关闭)
{
if(n . f = q-& gt;f节点)
{
link * q 1;
q 1 = q-& gt;接下来;
q->;next = q-& gt;下一个-& gt;接下来;
q->;下一个-& gt;pri = q;
免费(q 1);
n . sign = 0;
}
其他
q = q-& gt;接下来;
}
}
Void in_bestnode(node n)//将n节点设置为bestnode节点。
{
while(r-& gt;下一个!=最佳节点)
{
if(n . f & gt;= r-& gt;f节点)
{
r-& gt;下一个-& gt;pri =(link *)malloc(sizeof(link));
r-& gt;下一个-& gt;优先级-& gt;pri = r;
r = r-& gt;接下来;
r-& gt;优先级-& gt;next = r;
r-& gt;优先级-& gt;优先级-& gt;next = r-& gt;pri
r = r-& gt;pri
r-& gt;fnode . flag = n . flag;
r-& gt;fnode . f = n . f;
r-& gt;fnode . g = n . g;
r-& gt;fnode . h = n . h;
r-& gt;fnode . x = n . x;
r-& gt;fnode . y = n . y;
r-& gt;fnode . old = n . old;
}
其他
r = r-& gt;接下来;
}
bestnode-& gt;pri =(link *)malloc(sizeof(link));
bestnode-& gt;优先级-& gt;pri = r;
bestnode-& gt;优先级-& gt;next = bestnode
r-& gt;next = bestnode-& gt;pri
r = r-& gt;接下来;
r-& gt;fnode . flag = n . flag;
r-& gt;fnode . f = n . f;
r-& gt;fnode . g = n . g;
r-& gt;fnode . h = n . h;
r-& gt;fnode . x = n . x;
r-& gt;fnode . y = n . y;
r-& gt;fnode . old = n . old;
}
Void out_bestnode(node n)//删除n个节点的bestnode。
{
r = bestnode
while(r-& gt;下一个!=最佳节点)
{
if(n . f = p-& gt;f节点)
{
link * r 1;
r 1 = r-& gt;接下来;
r-& gt;next = r-& gt;下一个-& gt;接下来;
r-& gt;下一个-& gt;pri = r;
免费(r 1);
}
其他
r = r-& gt;接下来;
}
}
Void in_successor(node n)//将n节点设置为后继节点。
{
s =继任者;
while(s->;下一个!=继任者)
{
if(n . f & gt;= s-& gt;f节点)
{
s-& gt;下一个-& gt;pri =(link *)malloc(sizeof(link));
s-& gt;下一个-& gt;优先级-& gt;pri = s;
s = p-& gt;接下来;
s-& gt;优先级-& gt;next = s;
s-& gt;优先级-& gt;优先级-& gt;next = s-& gt;pri
s = s-& gt;pri
s-& gt;fnode . flag = n . flag;
s-& gt;fnode . f = n . f;
s-& gt;fnode . g = n . g;
s-& gt;fnode . h = n . h;
s-& gt;fnode . x = n . x;
s-& gt;fnode . y = n . y;
s-& gt;fnode . old = n . old;
}
其他
s = s-& gt;接下来;
}
继任者-& gt;pri =(link *)malloc(sizeof(link));
继任者-& gt;优先级-& gt;pri = s;
继任者-& gt;优先级-& gt;下一个=继任者;
s-& gt;下一个=继任者-& gt;pri
s = s-& gt;接下来;
s-& gt;fnode . flag = n . flag;
s-& gt;fnode . f = n . f;
s-& gt;fnode . g = n . g;
s-& gt;fnode . h = n . h;
s-& gt;fnode . x = n . x;
s-& gt;fnode . y = n . y;
s-& gt;fnode . old = n . old;
}
Void out_successor(node n)//删除n个节点的后继。
{
s =继任者;
while(s->;下一个!=继任者)
{
if(n . f = p-& gt;f节点)
{
link * s 1;
s 1 = s-& gt;接下来;
s-& gt;next = s-& gt;下一个-& gt;接下来;
s-& gt;下一个-& gt;pri = s;
免费(s 1);
}
其他
s = s-& gt;接下来;
}
}
Void print(link *n)//输出链接类型的表n。
{
link * forprint
for print = n;
printf("关键是");
while(for print-& gt;下一个!=n)
printf("(%d,%d)\n ",for print-& gt;fnode.x,for print-& gt;fnode . y);
}
int main()
{
//初始化部分
//这个部分的作用是将一个二维塑料数组赋给一个node类型的二维数组。
int i=0,j = 0;
for(I = 0;我& lt7;i++)
for(j = 0;j & lt7;j++)
{
迷宫[i][j]。x = I;
迷宫[i][j]。y = j;
迷宫[i][j]。flag = maze _ flag[I][j];
if(迷宫[i][j]。flag==0)
{
迷宫[i][j]。h = 6-I+6-j;
迷宫[i][j]。sign=maze[i][j]。f =迷宫[i][j]。g =迷宫[i][j]。旧= 0;
}
其他
迷宫[i][j]。h =-1;
}
for(I = 0;我& lt7;I++)//输出迷宫图
{
for(j = 0;j & lt7;j++)
{
printf("%2d ",maze _ flag[I][j]);
}
printf(" \ n ");
}
//该部分的作用是初始化开放、封闭和最佳节点表,并设置为空表。
p = open =(link *)malloc(sizeof(link));
打开->;下一个=打开;
打开->;pri =打开;
q = closed =(link *)malloc(sizeof(link));
关闭-& gt;下一个=关闭;
关闭-& gt;pri =关闭;
r = bestnode =(link *)malloc(sizeof(link));
bestnode-& gt;next = bestnode
bestnode-& gt;pri = bestnode
//将第一个元素(0,0)节点放入打开的表中,开始算法。
in _ open(maze[0][0]);
迷宫[0][0]。f =迷宫[0][0]。h;
link * s2
s2 =后继者;
如果(打开-& gt;下一个!= open)//如果打开的表为空,将无法退出。
{
while(1)
{
in _ bestnode(open-& gt;fnode);//将打开的表的第一个元素放入bestnode。
in_closed(迷宫[开放-& gt;fnode . x][open-& gt;fnode . y]);//将打开的表的第一个元素放入关闭的。
迷宫[开放-& gt;fnode . x][open-& gt;fnode.y】。g++;//打开表的第一个元素的g值加1,表示已经走了一步。
out _ open(maze[open-& gt;fnode . x][open-& gt;fnode . y]);//删除打开表格的第一个元素。
if(bestnode-& gt;= = 6 & amp& ampbestnode-& gt;Fnode.y==6)//如果bestnode是目标节点,则成功退出。
{
printf("成功!!\n然后打印密钥:\ n ");
打印(关闭);
打破;
}
否则//如果最佳节点不是目标节点,则将其附近的节点扩展为后继节点。
{
if(i==0||j==0||i==6||j==6)
{
if(I = = 0 & amp;& ampJ==0)//如果是(0,0),则判断右边和底部元素。
{
if(judge(maze[I][j+1])= = 0)
in _ successor(maze[I][j+1]);
if(judge(maze[I+1][j])= = 0)
in _ successor(maze[I+1][j]);
}
else if(I = = 0 & amp;& ampJ==6)//如果是(0,6),则判断左侧和底部元素。
{
if(judge(maze[I-1][j])= = 0)
in _ successor(maze[I-1][j]);
if(judge(maze[I+1][j])= = 0)
in _ successor(maze[I+1][j]);
}
else if(I = = 6 & amp;& ampJ==0)//如果是(6,0),则判断左上元素。
{
if(judge(maze[I-1][j])= = 0)
in _ successor(maze[I-1][j]);
if(judge(maze[I][j-1])= = 0)
in _ successor(maze[I][j-1]);
}
else if(I = = 6 & amp;& ampJ==6)//如果是(6,6),则判断左上元素。
{
if(judge(maze[I-1][j])= = 0)
in _ successor(maze[I-1][j]);
if(judge(maze[I][j-1])= = 0)
in _ successor(maze[I][j-1]);
}
Else if(i==0)//如果是第一行的元素(不在角上),判断左、下、右。
{
if(judge(maze[I][j+1])= = 0)
in _ successor(maze[I][j+1]);
if(judge(maze[I][j-1])= = 0)
in _ successor(maze[I][j-1]);
if(judge(maze[I+1][j])= = 0)
in _ successor(maze[I+1][j]);
}
Else if(i==6)//如果是第七行(不在角上)的元素,判断左、上、右。
{
if(judge(maze[I][j+1])= = 0)
in _ successor(maze[I][j+1]);
if(judge(maze[I][j-1])= = 0)
in _ successor(maze[I][j-1]);
if(judge(maze[I-1][j])= = 0)
in _ successor(maze[I-1][j]);
}
Else if(j==0)//如果是第一列的元素(不在角上),判断右、下、上。
{
if(judge(maze[I+1][j])= = 0)
in _ successor(maze[I+1][j]);
if(judge(maze[I-1][j])= = 0)
in _ successor(maze[I-1][j]);
if(judge(maze[I][j+1])= = 0)
in _ successor(maze[I][j+1]);
}
Else if(j==6)//如果是第七列(不在角上)的元素,判断左、上、上边。
{
if(judge(maze[I+1][j])= = 0)
in _ successor(maze[I+1][j]);
if(judge(maze[I-1][j])= = 0)
in _ successor(maze[I-1][j]);
if(judge(maze[I][j-1])= = 0)
in _ successor(maze[I][j-1]);
}
}
Else//如果是中将的元素,判断四个方向的节点。
{
if(judge(maze[I][j-1])= = 0)
in _ successor(maze[I][j-1]);
if(judge(maze[I][j+1])= = 0)
in _ successor(maze[I][j+1]);
if(judge(maze[I-1][j])= = 0)
in _ successor(maze[I-1][j]);
if(judge(maze[I+1][j])= = 0)
in _ successor(maze[I+1][j]);
}
}
而(s2->下一个!=后继)//对所有后继节点执行以下操作
{
迷宫[S2->;fnode . x][S2-& gt;fnode.y】。g = bestnode-& gt;fnode . g+bestnode-& gt;fnode.h//计算g(suc)=g(bes)+h(bes,suc)。
如果(s2->Fnode.sign==1)//如果在打开的表中,设置为旧,记下较小的G,从打开的表中取出放入关闭的表中。
{
S2->;fnode . old = 1;
如果(s2->fnode.g & lt迷宫[S2->;fnode . x][S2-& gt;fnode.y】。g)
{
迷宫[S2->;fnode . x][S2-& gt;fnode.y】。g=s2->fnode.g
迷宫[S2->;fnode . x][S2-& gt;fnode.y】。f =迷宫[S2-& gt;fnode . x][S2-& gt;fnode.y】。g+迷宫[S2-& gt;fnode . x][S2-& gt;fnode.y】。h;
out_open(迷宫[S2-& gt;fnode . x][S2-& gt;fnode . y]);
in_closed(迷宫[S2-& gt;fnode . x][S2-& gt;fnode . y]);
迷宫[S2->;fnode . x][S2-& gt;fnode.y】。旧= 0;
}
其他
继续;
}
else if(S2-& gt;Fnode.sign==2)//如果在封闭表中,则设置为old,记下较小的G,从封闭表中去掉old,将较小G的节点放入封闭表中。
{
S2->;fnode . old = 1;
如果(s2->fnode.g & lt迷宫[S2->;fnode . x][S2-& gt;fnode.y】。g)
{
迷宫[S2->;fnode . x][S2-& gt;fnode.y】。g=s2->fnode.g
迷宫[S2->;fnode . x][S2-& gt;fnode.y】。f =迷宫[S2-& gt;fnode . x][S2-& gt;fnode.y】。g+迷宫[S2-& gt;fnode . x][S2-& gt;fnode.y】。h;
out_closed(迷宫[S2-& gt;fnode . x][S2-& gt;fnode . y]);
in_closed(迷宫[S2-& gt;fnode . x][S2-& gt;fnode . y]);
迷宫[S2->;fnode . x][S2-& gt;fnode.y】。旧= 0;
}
其他
继续;
}
Else//如果已经不在打开的表或者关闭的表中,就把这个节点放到打开的表中,计算这个节点的F值。
{
in_open(迷宫[S2-& gt;fnode . x][S2-& gt;fnode . y]);
迷宫[S2->;fnode . x][S2-& gt;fnode.y】。f =迷宫[S2-& gt;fnode . x][S2-& gt;fnode.y】。g+迷宫[S2-& gt;fnode . x][S2-& gt;fnode.y】。h;
}
s2=s2->接下来;
}
s2 =后继者;
}
}
其他
printf("错误!!这个迷宫没有答案!”);
return(0);
}