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

u010423430 2013-09-24 08:24:12
#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;
}
...全文
302 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
u010423430 2013-11-02
  • 打赏
  • 举报
回复
引用 8 楼 zhao4zhong1 的回复:
不要使用
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;
 //...
}
类似的例子还可以举很多。
看了好长时间才看懂,谢谢啦
赵4老师 2013-09-29
  • 打赏
  • 举报
回复
不要使用
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;
 //...
}
类似的例子还可以举很多。
u010423430 2013-09-29
  • 打赏
  • 举报
回复
引用 3 楼 max_min_ 的回复:
[quote=引用 1 楼 u010423430 的回复:] 整体思路是 绘制一个0 1 表示的数组 1 表示死路 0 表示通路 设置while 循环 当 数组坐标不等于出口时 循环 用 if else 进行 上下左右 4个位置 选择 当0 时 把走过的上一点入栈,并且把上点标记为1 ,如果四面都没通路时 退栈 把 刚走过的点退栈 并且把 退出栈的点 标记为0
显然你们老师没有真正的帮忙, 你在while循环里判断++情况的最大值越界情况,却没有判断--情况的最小值的负数的情况 当 m = 0 或者 n = 0的时候,也是已经找到出路了的呢!!! 所以在while循环里加上 这个的判断吧![/quote] m 和 n 代表的是当前点的坐标while(m!=(MAX_Z-2)&&n!=(MAX_Z-2))指的是当m,n不等于出后坐标时,进行方向选择循环,或者是我没看懂你的意思?
yulitingfeng 2013-09-24
  • 打赏
  • 举报
回复
引用 1 楼 u010423430 的回复:
整体思路是 绘制一个0 1 表示的数组 1 表示死路 0 表示通路 设置while 循环 当 数组坐标不等于出口时 循环 用 if else 进行 上下左右 4个位置 选择 当0 时 把走过的上一点入栈,并且把上点标记为1 ,如果四面都没通路时 退栈 把 刚走过的点退栈 并且把 退出栈的点 标记为0
多加几个标点会死啊。。。
  • 打赏
  • 举报
回复
max_min_ 2013-09-24
  • 打赏
  • 举报
回复
引用 1 楼 u010423430 的回复:
整体思路是 绘制一个0 1 表示的数组 1 表示死路 0 表示通路 设置while 循环 当 数组坐标不等于出口时 循环 用 if else 进行 上下左右 4个位置 选择 当0 时 把走过的上一点入栈,并且把上点标记为1 ,如果四面都没通路时 退栈 把 刚走过的点退栈 并且把 退出栈的点 标记为0
显然你们老师没有真正的帮忙, 你在while循环里判断++情况的最大值越界情况,却没有判断--情况的最小值的负数的情况 当 m = 0 或者 n = 0的时候,也是已经找到出路了的呢!!! 所以在while循环里加上 这个的判断吧!
hustgonia 2013-09-24
  • 打赏
  • 举报
回复
坚决消灭零回复。
u010423430 2013-09-24
  • 打赏
  • 举报
回复
整体思路是 绘制一个0 1 表示的数组 1 表示死路 0 表示通路 设置while 循环 当 数组坐标不等于出口时 循环 用 if else 进行 上下左右 4个位置 选择 当0 时 把走过的上一点入栈,并且把上点标记为1 ,如果四面都没通路时 退栈 把 刚走过的点退栈 并且把 退出栈的点 标记为0
赵4老师 2013-09-24
  • 打赏
  • 举报
回复
仅供参考
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <graphics.h>
int xs[10000];
int ys[10000];
int i=0,xx,yy;
int fc,bc;
void push(int x,int y) {
    xs[i]=x;
    ys[i]=y;
    if (i<10000-1) {
        i=i+1;
    } else {
        printf("stack overflow!\n");
        exit(1);
    }
}
void pop(void) {
    i=i-1;
    xx=xs[i];
    yy=ys[i];
}
int check(int x,int y) {
    int c;

    c=getpixel(x,y); /* 获取当前点的颜色 */
    return ((c!=bc)&&(c!=fc));/* 如果颜色为边界色或填充色则不填充 */
}
void seedfilling(int x,int y,int fill_color,int boundary_color) {
    fc=fill_color;
    bc=boundary_color;
    push(x,y);
    while (1) {
        if (i<=0) return;
        pop();
        if (check(xx,yy)) {
            putpixel(xx, yy, 14);getch();  /* 加上这行显示当前填充状态 */

            putpixel(xx, yy, fill_color); /* 画点 */

            if (check(xx-1,yy  )) push(xx-1,yy  );
            if (check(xx  ,yy+1)) push(xx  ,yy+1);
            if (check(xx  ,yy-1)) push(xx  ,yy-1);
            if (check(xx+1,yy  )) push(xx+1,yy  );
            /* 去掉下面四句就是四连通 */
            if (check(xx-1,yy-1)) push(xx-1,yy-1);
            if (check(xx-1,yy+1)) push(xx-1,yy+1);
            if (check(xx+1,yy-1)) push(xx+1,yy-1);
            if (check(xx+1,yy+1)) push(xx+1,yy+1);
        }
    }
}
void main() {
    int a,b,color;
    int gdriver = DETECT, gmode, errorcode;
    int poly[10];

    initgraph(&gdriver, &gmode, "d:\\bc\\bgi");
    a=150;
    b=140;
    color=4;
    poly[0]=110;/* 第一个点的x坐标以及y坐标 */
    poly[1]=110;
    poly[2]=200;/* 第二点 */
    poly[3]=105;
    poly[4]=170;/* 第三点 */
    poly[5]=120;
    poly[6]=150;/* 第四点 */
    poly[7]=170;
    poly[8]=110;/* 多边形的起点与终点一样 */
    poly[9]=110;
    drawpoly(5,poly);/* 显示各点连接起来的多边形 */

    /* 保证边界对八连通是封闭的 */
    setviewport(0,1,600,300,0);
    drawpoly(5,poly);/* 显示各点连接起来的多边形 */
    setviewport(1,0,600,300,0);
    drawpoly(5,poly);/* 显示各点连接起来的多边形 */
    setviewport(1,1,600,300,0);
    drawpoly(5,poly);/* 显示各点连接起来的多边形 */

    /* 恢复默认viewport */
    setviewport(0,0,600,300,0);

    seedfilling(a,b,color,15);  /* 种子填充多边形 */

    getch();
    closegraph();
}

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧