当前位置:博客首页>>C/C++ >> 阅读正文

C语言数组练习-随机步法

作者: 郑晓 分类: C/C++ 发布于: 2013-05-11 12:00 浏览(24,128) 评论(12)


提前PS一下:本人小博的关键词个人博客已经上到第二页了,加油吧!!!
这是最近几天学习C语言数组、循环等的一个小练习..原题出自C语言程序设计-现代方法(第2版)。
先说一下程序的要求:
生成一种贯穿10*10字符数组(初始时全为字符 ‘.’ )的“随机步法”。程序必须随机地从一个元素“走到”另一个元素,每次都上下、向左或向右移动一个元素位置。已访问过的元素按访问顺序用字母A到Z进行标记。
随机方向使用rand函数来产生随机数,这里我使用rand()来产生一个属于0-3闭区间的数字以表示方向。
在执行移动之前,需要检查两项内容:一是不能走到数组外面,二是不能走到已有字母标记的位置。只要有一个条件不满足,就得尝试换一个方向移动。如果4个方向都堵住了,程序退出。

注释已经写的很详细了…
A的起始位置有两种方式:1.固定从[0][0]坐标开始;2.随机位置开始(使用随机位置开始后走到Z的机率明显增大了..)。
效果图:

c语言随机步法1

c语言随机步法1

c语言随机步法2

c语言随机步法2

代码:

#include <stdio.h>
#include <Windows.h>
#include <time.h>
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语言数组练习-随机步法:目前有12 条留言

用户评论头像 主板诊断卡批发发表于 2013年05月28日 19:01[回复]

学习了、、不过C语言不是一般人可以搞得掂、博主太牛了。。

用户评论头像 ixwebhosting发表于 2013年05月21日 17:57[回复]

C语言真的是技术活,好羡慕博主,向你学习了

    用户评论头像 郑晓发表于 2013年05月21日 21:25[回复]

    我也是新手,刚学这个。

用户评论头像 知我美发表于 2013年05月19日 21:52[回复]

真的很不错 值得学习一下

用户评论头像 亲亲美发表于 2013年05月19日 11:48[回复]

上学的时候经常用这些,现在荒废了。。

    用户评论头像 郑晓发表于 2013年05月19日 19:54[回复]

    嗯…所以现在打算重新学一下。。。 :mrgreen:

用户评论头像 夏宇轩博客发表于 2013年05月18日 12:30[回复]

来看你了,你的文章不错,欢迎回访

用户评论头像 网站被降权分析和恢复方法发表于 2013年05月17日 08:57[回复]

博客做的不错,个人博客都不容易,欢迎回访下我的博客。

用户评论头像 明星发表于 2013年05月16日 00:05[回复]

收藏。

用户评论头像 微库网发表于 2013年05月14日 23:54[回复]

收藏了 不错

用户评论头像 设备脚轮发表于 2013年05月14日 09:12[回复]

学习了回去我试一下看一下怎么样

用户评论头像 小Z发表于 2013年05月13日 12:13[回复]

哎呦,不错哦