C語言數組練習-隨機步法
作者: 鄭曉 分類: C/C++ 發(fā)布于: 2013-05-11 12:00 瀏覽:31,597 評論(13)
提前PS一下:本人小博的關鍵詞個人博客已經上到第二頁了,加油吧?。?!
這是最近幾天學習C語言數組、循環(huán)等的一個小練習..原題出自C語言程序設計-現代方法(第2版)。
先說一下程序的要求:
生成一種貫穿10*10字符數組(初始時全為字符 ‘.’ )的“隨機步法”。程序必須隨機地從一個元素“走到”另一個元素,每次都上下、向左或向右移動一個元素位置。已訪問過的元素按訪問順序用字母A到Z進行標記。
隨機方向使用rand函數來產生隨機數,這里我使用rand()來產生一個屬于0-3閉區(qū)間的數字以表示方向。
在執(zhí)行移動之前,需要檢查兩項內容:一是不能走到數組外面,二是不能走到已有字母標記的位置。只要有一個條件不滿足,就得嘗試換一個方向移動。如果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;
}
//循環(huán)多次后 判斷是否所有的方向都標記失敗。
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;
}
本文采用知識共享署名-非商業(yè)性使用 3.0 中國大陸許可協議進行許可,轉載時請注明出處及相應鏈接。
本文永久鏈接: http://m.yjfs.org.cn/c-language-array-of-exercises-random-footwork.html
/* 隨機步法 */
#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;
}