题意
想过很多种思路,比如直接用A-Z的ASCII来做循环,再判断周围是否为点,然后继续下去,但是如果生成的随机数是让其走出范围的或撞上已有的字母的,就需要重新生成随机数直到找到路,最后无路可走结束,又需要一次进一步判断。也想过把0 1 2 3试过后都不能前进则结束程序,但是计数又不太方便。方法还是选择分块写不同判断的函数来实现这个过程。代码能力 算法 数据结构都是刚刚开始学习,很多东西了解但是运用起来非常费劲,需要不断思考和大量练习。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<stdbool.h>
#define N 10
char map[N][N];
int i=0,j=0,next_i=0,next_j=0;
void nextstep(int next)//上0 右1 下2 左3
{
switch(next)
{
case 0:next_i=i-1;break;
case 1:next_j=j+1;break;
case 2:next_i=i+1;break;
case 3:next_j=j-1;break;
}
}
bool checknextstep(int next_i,int next_j)//判断下一步是否符合继续的要求
{
bool flag = false;
if((next_i>=0&&next_i<=N-1)&&(next_j>=0&&next_j<=N-1))
{
if(map[next_i][next_j]=='.')
{
flag = true;
}
}
return flag;
}
bool checkgoing(int i,int j)//判断当前这一步能不能继续走下去
{
bool flag = false;
if(checknextstep(i-1,j)||checknextstep(i+1,j)||checknextstep(i,j-1)||checknextstep(i,j+1))
{
flag = true;
}
return flag;
}
int main(void)
{
bool flag = true;
int next;
srand((unsigned)time(NULL));
for(i=0;i<N;i++)//初始化二维数组为点 第一个位置是'A'
{
for(j=0;j<N;j++)
{
map[i][j]={'.'};
}
}
char alp='A';//便于字母往后推动的处理
map[0][0]=alp;
i=0,j=0;//上面用过了i j做循环,需要重新初始化
while(flag)
{
if(checkgoing(i,j))
{
while(1)
{
next_i=i;
next_j=j;//初始化下一步位置next_i next_j为这一步位置
next=rand()%4;
nextstep(next);//推出下一步i或j的改变情况
if(checknextstep(next_i,next_j))//坐标改变后如果可以走下去
{
i=next_i;
j=next_j;//更新了位置
map[i][j]=++alp;//很巧妙地让字母往后移动
break;
}
}
}else{
flag = false;
}
if(alp>='Z')
{
flag = false;
}
}
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
printf("%c ",map[i][j]);
}
printf("\n");//二维数组换行输出
}
return 0;
}
输出一种结果如下
A . . . . . . . . .
B . . . . . . . . .
C . . . S T . . . .
D E F . R U . . . .
. . G P Q V . . . .
. . H O X W . . . .
. . I N M . . . . .
. . J K L . . . . .
. . . . . . . . . .
. . . . . . . . . .
ps 容易忘记第58行将i和j初始化清零