首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

写了一个求解出迷宫路径的程序,问了好多老师都没找到有关问题,求帮助

2013-11-02 
写了一个求解出迷宫路径的程序,问了好多老师都没找到问题,求帮助#includestdio.h#includestdlib.h#def

写了一个求解出迷宫路径的程序,问了好多老师都没找到问题,求帮助
#include<stdio.h>
#include<stdlib.h>
#define MAX_Z 10
#define MAX_X 3
#define MAX_Y 100
struct find_w
{
int x;
int y;
};
int main(void)
{
struct find_w stack[MAX_Y];
int i;
int j;
int m;
int n;
m=1;
n=1;
int count;
count=0;
int painter[MAX_Z][MAX_Z];
for(i=0;i<MAX_Z;i++)
for(j=0;j<MAX_Z;j++)
painter[i][j]=rand()%2;
i=0;
for(j=0;j<MAX_Z;j++)
{
painter[i][j]=1;
painter[j][i]=1;
}
i=MAX_Z-1;
for(j=0;j<MAX_Z;j++)
painter[j][i]=1;
i=MAX_Z-1;
for(j=0;j<MAX_Z;j++)
painter[i][j]=1;
painter[1][1]=0;
painter[MAX_Z-2][MAX_Z-2]=0;
for(i=0;i<MAX_Z;i++)
{
for(j=0;j<MAX_Z;j++)
printf("%d",painter[i][j]);
printf("\n");
}
while(m!=(MAX_Z-2)&&n!=(MAX_Z-2))  //当 mn 不为 出口时 不断循环
{
if(painter[m-1][n]==0) // 检测 下一点为 0时  可以走
{
painter[m][n]=1;  // 把走过的位置标记为1
stack[count].x=m;// 用栈 记录走过的点
stack[count].y=n;
count++;
m--;
}
else if(painter[m][n-1]==0)
{
painter[m][n]=1;
stack[count].x=m;
stack[count].y=n;
count++;
n--;
}
else if(painter[m][n+1]==0)
{
painter[m][n]=1;
stack[count].x=m;
stack[count].y=n;
count++;
n++;
}
else if(painter[m+1][n]==0)
{
painter[m][n]=1;
stack[count].x=m;
stack[count].y=n;
count++;
m++;
}
else//当上下左右都不能走时  退栈 把 将该点标记 为 0
{
painter[m][n]=1;
count--;
m=stack[count].x;
n=stack[count].y;
painter[m][n]=0;
}
}
for(i=0;i<count;i++)
{
printf("<%d",stack[i].x);
printf("%d>",stack[i].y);
}
return 0;
}
[解决办法]

不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
 if (条件1) break;
 //...
 if (条件2) continue;
 //...
 if (条件3) return;
 //...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语义都是当文件未结束时读字符
whlie (!feof(f)) {
 a=fgetc(f);
 //...
 b=fgetc(f);//可能此时已经feof了!
 //...
}
而这样写就没有问题:
whlie (1) {
 a=fgetc(f);
 if (feof(f)) break;
 //...
 b=fgetc(f);
 if (feof(f)) break;
 //...
}
类似的例子还可以举很多。

热点排行