user-0 提问: 请各位大神帮我看看书上的一道习题

回复:
user: user-1
content: 我感觉挺有意思的，也写了一个！申明下 我不会算法，只是简单的实现  #include <stdlib.h> #include <stdio.h> #include <string.h> #include <time.h> #include <unistd.h>  #define LEFT_MOVE  0 #define RIGHT_MOVE 1  #define UP_MOVE    2 #define DOWN_MOVE  3 void PrintArray( char (*arr)[10], int llen, int rlen ) {     int i, j;     for( i = 0; i < llen; i++)     {            for(j = 0; j < rlen; j++)             printf("%c ", arr[i][j]);         printf("\n");     }    }  void CreateArray( char (*arr)[10], int llen, int rlen ) {     int i, j;     for( i = 0; i < llen; i++)     {            for(j = 0; j < rlen; j++)             arr[i][j] = '*';     }    }  void CreateMaze (char (*arr)[10], int llen, int rlen ) {     static char Head = 'A';     int i = 0, j = 0;     while( i < llen && j < rlen && Head < 'Z')     {            arr[i][j] = Head;         int  direction = -1 ,times = 4;         bool timesflag = true; //每一个点最多轮询四次，符合条件后则跳出         bool directionflag[4] = {false}; // 每个方向值轮询一次.避免多此轮询同一个方向         srand(time(NULL));       // 产生随机种子         while( times > 0 && timesflag)           {             direction = rand()%4;             switch( direction )             {                 case UP_MOVE:                     {                         if((i - i) >= 0 && arr[i-1][j] == '*')                         {                              i = i -1;                             Head = Head +1;                             arr[i][j] = Head;                             timesflag = false;                         }                         if (!directionflag[0] )                         {                             times--;                         }                         directionflag[0] = true;                         break;                     }                 case DOWN_MOVE:                     {                         if((i+1) < 10 && arr[i+1][j] == '*')                         {                             i = i +1;                             Head = Head +1;                             arr[i][j] = Head;                             timesflag = false;                         }                         if (!directionflag[2] )                         {                             times--;                         }                         directionflag[2] = true;                         break;                     }                 case LEFT_MOVE:                     {                         if( (j -1) >= 0 && arr[i][j-1] == '*')                         {                             j = j -1;                             Head = Head +1;                             arr[i][j] = Head;                             timesflag = false;                         }                         if (!directionflag[1] )                         {                             times--;                         }                         directionflag[1] = true;                         break;                     }                 case RIGHT_MOVE:                     {                         if((j+1) < 10 && arr[i][j+1] == '*')                         {                             j = j+1;                             Head = Head +1;                             arr[i][j] = Head;                             timesflag = false;                         }                         if (!directionflag[3] )                         {                             times--;                         }                         directionflag[3] = true;                         break;                     }             }         }         if( times == 0 && timesflag ) //出口         {             return;         }         sleep(1);     } } int main(void) {     int RunTimes = 10;     char arr[10][10] = {0};     CreateArray(arr, 10, 10);      CreateMaze(arr, 10 ,10);      PrintArray(arr, 10, 10);     return 0; }

user: user-2
content: 引用 楼主 u012857025 的回复: 这是书上的习题  #include <stdio.h> #include <time.h> #include <stdlib.h> #include <stdbool.h>  #define N 10 #define CURRENTLETTER ch[x][y] #define NEXTLETTER ch[x][y]+1 #define FILLER '.'  /**********************************  * used to judge whether the      *  * place is legal to put a letter *  **********************************/ 	  bool legal(int x, int y){ 	char ch[x][y]; 	if( ch[x][y]==FILLER && 		x>0 && x<=10 && 		y>0 && y<=10) 		return true; 	else return false; }  int main(){ 	char ch[N][N]={0}; 	int x, y, movesTried = 0; 	 	for(x=1;x<=N;x++) 		for(y=1;y<=N;y++) 			ch[x][y]=FILLER; 	 	srand((unsigned)time(NULL)); 	 	x=1; 	y=1; 	CURRENTLETTER='A'; 	 	while(CURRENTLETTER < 'Z' && movesTried < 4){ 		switch(rand()%4){ 			case 0: 			if(legal(x+1,y)){ 				x++ ; 				CURRENTLETTER = NEXTLETTER ; 				movesTried = 0; 			}else movesTried++; 			break; 		 			case 1: 			if(legal(x-1,y)){ 				x-- ; 				CURRENTLETTER = NEXTLETTER ;  				movesTried = 0; 			}else movesTried++; 			break; 			 			case 2: 			if(legal(x,y-1)){ 				y-- ; 				CURRENTLETTER = NEXTLETTER ; 				movesTried = 0; 			}else movesTried++; 			break; 		 			case 3: 			if(legal(x,y+1)){ 				y++; 				CURRENTLETTER = NEXTLETTER ; 				movesTried = 0; 			}else movesTried++; 			break; 		} 	} 	 	for(x=1;x<=N;x++){ 		for(y=1;y<=N;y++){ 			printf("%c ",CURRENTLETTER); 		} 		printf("\n"); 	} 	 	return 0; }  这是我的代码，我这几天反反复复查了好几次，都没有查出问题在哪里，劳请各位大大帮我看一看难道你没有设置断点，逐步调试？

user: user-3
content: 引用 2 楼 JiMoKuangXiangQu 的回复:函数legal()应该是这样修改吧： bool legal(char [10][10], int x, int y) {     //char ch[x][y]; // 这里是在另外开辟了一个数组，和main里面不是同一个了     //另外如楼上的注意边界检查 }  写错了，修正如下： bool legal(char ch[10][10], int x, int y) {     //char ch[x][y]; // 这里是在另外开辟了一个数组，和main里面不是同一个了     //另外如楼上的注意边界检查 }

user: user-3
content: 函数legal()应该是这样修改吧： bool legal(char [10][10], int x, int y) {     //char ch[x][y]; // 这里是在另外开辟了一个数组，和main里面不是同一个了     //另外如楼上的注意边界检查 }

user: user-4
content: bool legal(int x, int y){     char ch[x][y];     if( ch[x][y]==FILLER &&         x>0 && x<=10 &&    ////x >= 0  && x < 10??         y>0 && y<=10)      ////y >= 0  && y < 10??         return true;     else return false; }

user: user-5
content: 很有意思的小程序

user: user-6
content: #include <stdio.h> #include <time.h> #include <stdlib.h> #define MAXX 10 #define MAXY 10 void main() {     char MAP[MAXX][MAXY];     char str;     int x,y,z,f,n;      for (x=0;x<MAXX;x++) {         for (y=0;y<MAXY;y++) {             MAP[x][y]='.';         }     }      for (x=0;x<MAXX;x++) {         printf("\n");         for (y=0;y<MAXY;y++) {             printf("%c",MAP[x][y]);         }     }     printf("\n");      srand((unsigned) time(NULL)); RETRY:     x=0;y=0;str='A';MAP[x][y]=str;      for (str='B';str<='Z';str++) {         n=0;         f=1;         while (1) {             n++;             z=rand()%4;             switch (z) {                 case 0: if (y+1<MAXY && MAP[x  ][y+1]=='.') {y++;MAP[x][y]=str;f=0;} break;                 case 1: if (x+1<MAXX && MAP[x+1][y  ]=='.') {x++;MAP[x][y]=str;f=0;} break;                 case 2: if (y-1>0    && MAP[x  ][y-1]=='.') {y--;MAP[x][y]=str;f=0;} break;                 case 3: if (x-1>0    && MAP[x-1][y  ]=='.') {x--;MAP[x][y]=str;f=0;} break;             }             if (f==0) break;             if (n>20) {//钻入死胡同                 for (x=0;x<MAXX;x++) {                     for (y=0;y<MAXY;y++) {                         MAP[x][y]='.';                     }                 }                 goto RETRY;             }         }//while         if (x==MAXX-1 || y==MAXY-1) break;     }//for      for (x=0;x<MAXX;x++) {         printf("\n");         for (y=0;y<MAXY;y++) {             printf("%c",MAP[x][y]);         }     }     printf("\n"); }