请问加了个for,while就成死循环,如果删掉for,程序执行成功,但是二者根本毫无关系?

ganli123 2008-03-28 10:10:41
各位大侠,请问我下面这个程序段(迷宫问题)错在什么地方?如果我在声明了数组后面加入一个显示组二维数组的for循环语句,结果后面的while循环就好像是死循环了,如果没有这个for,程序就可以执行成功,前面的for与后面的while根本没有嵌套,毫不相关,这是为什么啊?头疼!

#include <iostream.h>
#include <windows.h>
#include<math.h>
const n=4,m=5;
int entr(int y[n][m], int z)///////////////////////找第1行是否有0元素
{
int entrance_y;
while (z<m)
{
if (y[1][z]==0)
{
entrance_y=z;
return entrance_y;
}
else return 0;
}
}
void main()
{
int y[4][5]={{4,4,4,4,4},{4,0,0,2,4},{4,2,2,2,4},{4,2,2,2,4}};
for (int i=0;i<n;i++)
{
for (int j=0;j<m;j++)
cout<<y[i][j]<<" ";////////////////////////////////////////加了这个循环后就不行了,删掉的话,整个程序执行成功????????????????
cout<<endl;
}
for (int j=1;j<m;j++)
{
int entrance_x=1;
int a=entrance_x;
int b=entr(y,j);
if (b==0)
continue;
int c=b;
//cout<<"The entrance is :"<<"("<<a<<","<<b<<")"<<c<<endl;

while (a<n)//在点(i,j)上探索,不达最后一行时,反复搜索。
{
//处理死点。

if (y[a-1][b]>=2&&y[a][b+1]>=2&&y[a+1][b]>=2&&a>1&&b>1)
{
y[a][b]=3;b--;
}
if (y[a][b-1]==4&&y[a][b+1]==2&&y[a+1][b]==2&&y[a-1][b]==4)//左顶角
{
y[a][b]=3;
}
else if (y[a][b+1]>=2&&y[a+1][b]>=2&&y[a][b-1]>=0)
{
y[a][b]=3;a--;
}
else if (y[a+1][b]>=2&&y[a][b-1]>=2&&y[a-1][b]>=2&&a>1&&b>1)
{
y[a][b]=3;b++;
}
else y[a][b]=1;

//按逆时针先走没走过的点
if (y[a+1][b]==0) a++;
else if (y[a][b+1]==0) b++;
else if (y[a-1][b]==0) a--;
else if (y[a][b-1]==0) b--;

//按顺时针走走过的点
else if (y[a-1][b]==1) a--;
else if (y[a][b+1]==1) b++;
else if (y[a+1][b]==1) a++;
else if (y[a][b-1]==1) b--;

//如果不通,则跳出该循环
if (y[entrance_x][c]==3)
break;
for (int j=1;j<m;j++)
{
if (y[n-1][j]==1)
a=m;
}
}
}
for(j=1;j<5;j++)
{
if (y[n-1][j]!=1)
cout<<"The probability p is small."<<endl;
else
cout<<"p reaches the critical probability pc."<<endl;
}
for (int k=0;k<n;k++)
{
for (j=0;j<m;j++)
cout<<y[k][j]<<" ";
cout<<endl;
}
}

...全文
255 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
kkkgho 2008-03-30
  • 打赏
  • 举报
回复
下标越界了
不想低调 2008-03-30
  • 打赏
  • 举报
回复
lz的代码..是解决迷宫的吗?!

4 4 4 4 4
4 3 3 2 4
4 2 2 2 4
4 2 2 2 4
4、2、3分别代表什么??
ganli123 2008-03-30
  • 打赏
  • 举报
回复
谢谢了哈~~~~~~~好像真的是越界了~~~~~~谢谢了哈~~~~~~~~
帅得不敢出门 2008-03-30
  • 打赏
  • 举报
回复
[b+1] 越界
ganli123 2008-03-30
  • 打赏
  • 举报
回复
恩 是用解迷宫的办法去解决逾渗系统,4代表边界,3代表没走通,2代表逾渗中的空位(没占据的位),0代表逾渗中被占据的位,1代表能走通的path。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~的确是下标越界了~~~~~~~~~~~~~~~~谢谢各位了啊!!!
crushor 2008-03-30
  • 打赏
  • 举报
回复
再罗唆一句,都开始写这么复杂的东东了(反正我是没看懂你是要怎么走迷宫),数组下标这种事情还是应当注意下的吧。
crushor 2008-03-30
  • 打赏
  • 举报
回复
死循环就对了
这不是for循环的问题,而是你的走迷宫代码的问题,
你可以把你觉得有问题的那段for循环随便替换一个变量声明,比如
int sisisisisisi =0;
可以发现,仍然会死循环。
死循环的原因是你的代码逻辑有问题,迷宫是走不出去的。
为什么删除了这个for循环或者int变量就不会死循环了?
那是因为,你在给数组赋值时,数组下标越界,刚好踩到了变量a,歪打正着,反而给循环出去了;
而增加了循环或者变量声明,a和数组Y的相对偏移就变了,数组越界也踩不倒a了,所以就死循环了,正是你代码的本来面目。
你可以把a之前(为什么是之前?搜下栈的知识看下吧)的变量声明随便改改试试看就知道了。

是当a=-1,b=2时,由这一句把a给踩掉了。
else y[a][b] = 1;

不过有趣的是,y[-1][2]也就是y[ffffffff][2]编译器怎么处理了?这样往后偏移早就超过内存寻址范围了,
应该是取了补码,而从内存分布上来看,看起来就像是从y往前数(-1)行的第2个元素也就是a了。


另外,你的代码风格也太有个性了吧。
barenx 2008-03-29
  • 打赏
  • 举报
回复
现看看代码

#include  <iostream.h>
#include <windows.h>
#include <math.h>
const n = 4, m = 5;
int entr(int y[n][m], int z) ///////////////////////找第1行是否有0元素
{
int entrance_y;
while (z < m)
{
if (y[1][z] == 0)
{
entrance_y = z;
return entrance_y;
}
else return 0;
}
}
void main()
{
int y[4][5] = {{4, 4, 4, 4, 4}, {4, 0, 0, 2, 4}, {4, 2, 2, 2, 4}, {4, 2, 2, 2, 4}};
for (int i = 0;i < n;i++)
{
for (int j = 0;j < m;j++)
cout < < y[i][j] < < " "; ////////////////////////////////////////加了这个循环后就不行了,删掉的话,整个程序执行成功????????????????
cout < < endl;
}
for (int j = 1;j < m;j++)
{
int entrance_x = 1;
int a = entrance_x;
int b = entr(y, j);
if (b == 0)
continue;
int c = b;
//cout < <"The entrance is :" < <"(" < <a < <"," < <b < <")" < <c < <endl;

while (a < n) //在点(i,j)上探索,不达最后一行时,反复搜索。
{
//处理死点。

if (y[a - 1][b] >= 2 && y[a][b + 1] >= 2 && y[a + 1][b] >= 2 && a > 1 && b > 1)
{
y[a][b] = 3;b--;
}
if (y[a][b - 1] == 4 && y[a][b + 1] == 2 && y[a + 1][b] == 2 && y[a - 1][b] == 4) //左顶角
{
y[a][b] = 3;
}
else if (y[a][b + 1] >= 2 && y[a + 1][b] >= 2 && y[a][b - 1] >= 0)
{
y[a][b] = 3;a--;
}
else if (y[a + 1][b] >= 2 && y[a][b - 1] >= 2 && y[a - 1][b] >= 2 && a > 1 && b > 1)
{
y[a][b] = 3;b++;
}
else y[a][b] = 1;

//按逆时针先走没走过的点
if (y[a + 1][b] == 0) a++;
else if (y[a][b + 1] == 0) b++;
else if (y[a - 1][b] == 0) a--;
else if (y[a][b - 1] == 0) b--;

//按顺时针走走过的点
else if (y[a - 1][b] == 1) a--;
else if (y[a][b + 1] == 1) b++;
else if (y[a + 1][b] == 1) a++;
else if (y[a][b - 1] == 1) b--;

//如果不通,则跳出该循环
if (y[entrance_x][c] == 3)
break;
for (int j = 1;j < m;j++)
{
if (y[n - 1][j] == 1)
a = m;
}
}
}
for (j = 1;j < 5;j++)
{
if (y[n - 1][j] != 1)
cout < < "The probability p is small." < < endl;
else
cout < < "p reaches the critical probability pc." < < endl;
}
for (int k = 0;k < n;k++)
{
for (j = 0;j < m;j++)
cout < < y[k][j] < < " ";
cout < < endl;
}
}


ganli123 2008-03-29
  • 打赏
  • 举报
回复
单步调试每问题啊~~~~~~~~~
ganli123 2008-03-28
  • 打赏
  • 举报
回复
谢谢啦,看看先~~~~~~~~~~~~
chuengchuenghq 2008-03-28
  • 打赏
  • 举报
回复
vs 2005上通不过,默认类型应该是int型
cplusplus2007 2008-03-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 chuengchuenghq 的回复:]
const修饰要做类型说明吧
[/Quote]
如果没有指定类型,能通过编译吗?如果通过了,编译器会默认为什么类型?
chuengchuenghq 2008-03-28
  • 打赏
  • 举报
回复
const修饰要做类型说明吧
babyvox1999 2008-03-28
  • 打赏
  • 举报
回复
要学会单步,设置端点调试。。。
ganli123 2008-03-28
  • 打赏
  • 举报
回复
是主函数中的for与while,谢谢各位大侠啦~~~~~~~~~~~~
zhoufuguo8802 2008-03-28
  • 打赏
  • 举报
回复
多调试一下就差不多了
ganli123 2008-03-28
  • 打赏
  • 举报
回复
输出的结果的确是:  
4 4 4 4 4
4 0 0 2 4
4 2 2 2 4
4 2 2 2 4
不过这只是那个for循环的作用,程序执行到这里显示这个矩阵后,就不能再执行下去了,while循环根本没有执行,如果把那个for删除以后显示的结果就是:
4 4 4 4 4
4 3 3 2 4
4 2 2 2 4
4 2 2 2 4
而这才是我想要的结果,上面那个矩阵只是显示了原二维数组的值.


houdongfeng 2008-03-28
  • 打赏
  • 举报
回复
我在我机子上测试,一切正常啊
WuBill 2008-03-28
  • 打赏
  • 举报
回复
输出结果:
4 4 4 4 4
4 0 0 2 4
4 2 2 2 4
4 2 2 2 4
WuBill 2008-03-28
  • 打赏
  • 举报
回复
我在我机子上测试,一切正常啊
xp+sp2 + vc6

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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