C语言-随机步法

生成一种贯穿10*10字符数组的“随机步法”。程序必须随机的从一个元素走到另一个元素,每次都向上,向下,向左,或者向右移动一个元素的位置。已访问过的元素按顺序用字母A-Z来标记。如果四个方向都堵住了,程序就终止了。


#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;
}

转载于 http://www.zh30.com/c-language-array-of-exercises-random-footwork

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值