Chinaunix首页 | 论坛 | 博客
  • 博客访问: 91542
  • 博文数量: 16
  • 博客积分: 367
  • 博客等级: 一等列兵
  • 技术积分: 245
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-25 22:37
文章分类

全部博文(16)

文章存档

2012年(4)

2011年(12)

我的朋友

分类: C/C++

2011-11-22 13:13:36

还是上一篇博客的问题:

    编写一个程序,生成一个贯穿10*10的字符数组(初始时全为字符‘.’)的“随机步法”,程序必须每次从一个元素走到另外一个元素,方向随机为前、后、左、右,元素按照访问顺序用字母AZ标记,如果其中某个元素前后左右都已经有字母标记,则停止。

 

    下面是我写的程序,思路是用随机数控制方向:

#include

#define N 10

#define UP 0

#define DOWN 1

#define LEFT 2

#define RIGHT 3


int main()

{

char a[N][N] = {'0'};

int i, j, dirc;

srand((unsigned)time(NULL));

printf("Program begins:\n");

for(i = 0; i < N; i++){//init a[N][N]

for(j = 0; j < N; j++){

if(i == 0 && j == 0)

a[i][j] = 'A';

else 

a[i][j] = '.';

}

}

i = 0, j = 0;

while(1){

dirc = rand() % 4;//0 = up, 1 = down, 2 = left, 3 = right

printf("%d\n", dirc);

if(dirc == RIGHT && a[i][j+1] == '.' && (j + 1) < N){//move right

a[i][j + 1] = a[i][j] + 1;

j = j + 1;

}

else if(dirc == LEFT && a[i][j-1] == '.' && (j - 1) >= 0){//move left

a[i][j-1] = a[i][j] + 1;

j = j - 1;

}

else if(dirc == UP && a[i-1][j] == '.' && (i - 1) >= 0){//move up

a[i-1][j] = a[i][j] + 1;

i = i - 1;

}

else if(dirc == DOWN && a[i+1][j] == '.' && (i + 1) < N){//move down

a[i+1][j] = a[i][j] + 1;

i = i + 1;

}

if(a[i][j] == 'Z')//if mark to 'Z'..stop

break;

else if(a[i+1][j] != '.' && a[i-1][j] != '.' && a[i][j+1] != '.' && a[i][j-1] != '.')//if no direction to move...stop

break;

}

for(i = 0; i < N; i++){//print result

for(j = 0; j < N; j++){

printf("%c ",a[i][j]);

if(j == 9)

printf("\n");

}

}


}

程序大部分次数运行都正常,效果如图:

但是多次测试发现,有时候程序运行会进入死循环...,分析代码逻辑看不出什么问题,重定向打印了随机数也没发现随机数有什么循环规律...后来重新分析逻辑,应该是逻辑方面发生了纰漏...果然,死循环的原因在于没有考虑标记到了边界,而同时其他3个方向都已经标记了字母的情况...添加逻辑判断语句,问题解决

阅读(1851) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

sunny_piza2011-11-24 14:54:44

, 不错呀, 呵呵。