急:C语言迷宫问题代码!

# include & ltstdio.h & gt

# 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);

}