當(dāng)前位置:博客首頁>>C/C++ >> 閱讀正文

C語言數(shù)組練習(xí)-隨機(jī)步法

作者: 鄭曉 分類: C/C++ 發(fā)布于: 2013-05-11 12:00 瀏覽:31,388 評(píng)論(13)


提前PS一下:本人小博的關(guān)鍵詞個(gè)人博客已經(jīng)上到第二頁了,加油吧?。?!
這是最近幾天學(xué)習(xí)C語言數(shù)組、循環(huán)等的一個(gè)小練習(xí)..原題出自C語言程序設(shè)計(jì)-現(xiàn)代方法(第2版)。
先說一下程序的要求:
生成一種貫穿10*10字符數(shù)組(初始時(shí)全為字符 ‘.’ )的“隨機(jī)步法”。程序必須隨機(jī)地從一個(gè)元素“走到”另一個(gè)元素,每次都上下、向左或向右移動(dòng)一個(gè)元素位置。已訪問過的元素按訪問順序用字母A到Z進(jìn)行標(biāo)記。
隨機(jī)方向使用rand函數(shù)來產(chǎn)生隨機(jī)數(shù),這里我使用rand()來產(chǎn)生一個(gè)屬于0-3閉區(qū)間的數(shù)字以表示方向。
在執(zhí)行移動(dòng)之前,需要檢查兩項(xiàng)內(nèi)容:一是不能走到數(shù)組外面,二是不能走到已有字母標(biāo)記的位置。只要有一個(gè)條件不滿足,就得嘗試換一個(gè)方向移動(dòng)。如果4個(gè)方向都堵住了,程序退出。

注釋已經(jīng)寫的很詳細(xì)了…
A的起始位置有兩種方式:1.固定從[0][0]坐標(biāo)開始;2.隨機(jī)位置開始(使用隨機(jī)位置開始后走到Z的機(jī)率明顯增大了..)。
效果圖:

c語言隨機(jī)步法1

c語言隨機(jī)步法1

c語言隨機(jī)步法2

c語言隨機(jī)步法2

代碼:

#include
#include
#include
int x,y;
int main(void) {
//this_x this_y 當(dāng)前坐標(biāo)
//direction 行走方向 0,1,2,3 上右下左
//flag 行走成功標(biāo)記 flag_up_fail等為對(duì)應(yīng)方向行走失敗標(biāo)記
int this_x=0,this_y=0,direction,flag,flag_up_fail,flag_right_fail,flag_down_fail,flag_left_fail;
//定義字符ch,矩陣數(shù)組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';//從坐標(biāo)0,0開始 如果從A開始 則注釋下面三行 for從ch='B'開始 //或者行走前隨機(jī)選擇起始坐標(biāo)點(diǎn)。 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);//每走一步后重新生成隨機(jī)數(shù)種子 //每走一步后重置所有成功和失敗標(biāo)記 flag = 0; flag_up_fail=0,flag_right_fail=0,flag_down_fail=0,flag_left_fail=0; //開始隨機(jī)'向下一方向行走' while(1) { //獲得隨機(jī)方向0~3 direction = rand()%4; switch(direction) { case 0 : //向上 //判斷 如果將要行走的方向未越界 且 是未走過的 則 //將當(dāng)前ch走向此方向,坐標(biāo)更新,成功標(biāo)記。 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 {
//此方向不可走 標(biāo)記失敗
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;
}
//循環(huán)多次后 判斷是否所有的方向都標(biāo)記失敗。
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"循環(huán) 開始下一步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;}

? ? ? ?

本文采用知識(shí)共享署名-非商業(yè)性使用 3.0 中國大陸許可協(xié)議進(jìn)行許可,轉(zhuǎn)載時(shí)請(qǐng)注明出處及相應(yīng)鏈接。

本文永久鏈接: http://yjfs.org.cn/c-language-array-of-exercises-random-footwork.html

C語言數(shù)組練習(xí)-隨機(jī)步法:目前有13 條留言

用戶評(píng)論頭像 哈哈后發(fā)表于 2023年04月21日 16:14[回復(fù)]

/* 隨機(jī)步法 */

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

發(fā)表評(píng)論

change vcode