C语言数组练习-随机步法
作者: 郑晓 分类: C/C++ 发布于: 2013-05-11 12:00 浏览:30,973 评论(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 条留言
/* 随机步法 */
#include
#include
#include
#define NUM_ROWS 10
#define NUM_COLS 10
int main(void)
{
char grid[NUM_ROWS][NUM_COLS];
int row, col, direction, i, j;
char ch;
for (i = 0; i < NUM_ROWS; i++)
for (j = 0; j < NUM_COLS; j++)
grid[i][j] = '.';
srand((unsigned)time(NULL));
ch = 'A';
row = 0;
col = 0;
while (ch <= 'Z')
{
grid[row][col] = ch++;
direction = rand() % 4;
for (i = 0; i = 0 && row = 0 && col < NUM_COLS && grid[row][col] == '.')
break;
row = old_row;
col = old_col;
direction = (direction + 1) % 4;
}
if (i == 4)
break;
}
for (i = 0; i < NUM_ROWS; i++)
{
for (j = 0; j < NUM_COLS; j++)
printf("%2c", grid[i][j]);
printf("\n");
}
return 0;
}