C语言数组练习-随机步法
作者: 郑晓 分类: C/C++ 发布于: 2013-05-11 12:00 浏览:31,546 评论(13)
提前PS一下:本人小博的关键词个人博客已经上到第二页了,加油吧!!!
这是最近几天学习C语言数组、循环等的一个小练习..原题出自C语言程序设计-现代方法(第2版)。
先说一下程序的要求:
生成一种贯穿10*10字符数组(初始时全为字符 ‘.’ )的“随机步法”。程序必须随机地从一个元素“走到”另一个元素,每次都上下、向左或向右移动一个元素位置。已访问过的元素按访问顺序用字母A到Z进行标记。
随机方向使用rand函数来产生随机数,这里我使用rand()来产生一个属于0-3闭区间的数字以表示方向。
在执行移动之前,需要检查两项内容:一是不能走到数组外面,二是不能走到已有字母标记的位置。只要有一个条件不满足,就得尝试换一个方向移动。如果4个方向都堵住了,程序退出。
注释已经写的很详细了…
A的起始位置有两种方式:1.固定从[0][0]坐标开始;2.随机位置开始(使用随机位置开始后走到Z的机率明显增大了..)。
效果图:
代码:
#include
#include
#include
int x,y;
int main(void) {
//this_x this_y 当前坐标
//direction 行走方向 0,1,2,3 上右下左
//flag 行走成功标记 flag_up_fail等为对应方向行走失败标记
int this_x=0,this_y=0,direction,flag,flag_up_fail,flag_right_fail,flag_down_fail,flag_left_fail;
//定义字符ch,矩阵数组arr
char ch, arr[10][10];
int print_info(char arr[10][10]);
//初始化矩阵arr
//for(x=0;x<10;x++)
// for(y=0;y<10;y++)
// arr[x][y]='.';
memset(arr,'.',sizeof(arr));
//arr[this_x][this_y] = 'A';//从坐标0,0开始 如果从A开始 则注释下面三行 for从ch='B'开始
//或者行走前随机选择起始坐标点。
srand((unsigned)time(NULL));
this_x = rand() % 10;
this_y = rand() % 10;
for(ch='A';ch<='Z';ch++) { //希望从A走到Z
srand((unsigned)time(NULL)+ch);//每走一步后重新生成随机数种子
//每走一步后重置所有成功和失败标记
flag = 0;
flag_up_fail=0,flag_right_fail=0,flag_down_fail=0,flag_left_fail=0;
//开始随机'向下一方向行走'
while(1) {
//获得随机方向0~3
direction = rand()%4;
switch(direction) {
case 0 : //向上
//判断 如果将要行走的方向未越界 且 是未走过的 则
//将当前ch走向此方向,坐标更新,成功标记。
if((this_y-1)>=0 && arr[this_x][this_y-1]=='.') {
this_y -=1;
arr[this_x][this_y] = ch;
flag=1;
printf("行走成功,ch:%c,方向:%d\n",ch,direction);
} else {
//此方向不可走 标记失败
flag_up_fail=1;
}
break;//跳出switch
case 1 : //向右
if((this_x+1)<=9 && arr[this_x+1][this_y]=='.'){
this_x +=1;
arr[this_x][this_y] = ch;
flag=1;
printf("行走成功,ch:%c,方向:%d\n",ch,direction);
} else {
flag_right_fail=1;
}
break;
case 2 : //向下
if((this_y+1)<=9 && arr[this_x][this_y+1]=='.'){
this_y +=1;
arr[this_x][this_y] = ch;
flag=1;
printf("行走成功,ch:%c,方向:%d\n",ch,direction);
} else {
flag_down_fail=1;
}
break;
case 3 : //向左
if((this_x-1)>=0 && arr[this_x-1][this_y]=='.'){
this_x -=1;
arr[this_x][this_y] = ch;
flag=1;
printf("行走成功,ch:%c,方向:%d\n",ch,direction);
} else {
flag_left_fail=1;
}
break;
}
//循环多次后 判断是否所有的方向都标记失败。
if(flag_up_fail==1 && flag_right_fail==1 && flag_down_fail==1 && flag_left_fail==1) {
return print_info(arr);
}
if(flag==1)break;//行走成功 跳出"行走while"循环 开始下一步for行走
}
}
return print_info(arr);
}
/*打印矩阵、退出*/
int print_info(char arr[10][10]) {
printf("\n");
for(y=0;y<10;y++) {
for(x=0;x<10;x++) {
printf("%c ",arr[x][y]);
}
printf("\n");
}
system("pause");
return 0;
}
本文采用知识共享署名-非商业性使用 3.0 中国大陆许可协议进行许可,转载时请注明出处及相应链接。
本文永久链接: https://www.zh30.com/c-language-array-of-exercises-random-footwork.html
C语言数组练习-随机步法:目前有13 条留言
学习了、、不过C语言不是一般人可以搞得掂、博主太牛了。。
C语言真的是技术活,好羡慕博主,向你学习了
我也是新手,刚学这个。
真的很不错 值得学习一下
上学的时候经常用这些,现在荒废了。。
嗯…所以现在打算重新学一下。。。
来看你了,你的文章不错,欢迎回访
博客做的不错,个人博客都不容易,欢迎回访下我的博客。
收藏。
收藏了 不错
学习了回去我试一下看一下怎么样
哎呦,不错哦