#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand((unsigned) time(NULL)); // 使用当前时间作为随机数种子
char fk[10][10];
int i,j;
for (i=0;i<10;i++)
{
for (j=0;j<10;j++)
{
fk[i][j]='.';
}
}
fk[0][0]='A';
char alp[100]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
int m=0,n=0,count=0;
int on=0,und=0,left=0,right=0;
while (true)
{
if (m-1<0 || fk[m-1][n]!='.') on=1;
if (m+1>9 || fk[m+1][n]!='.') und=1;
if (n-1<0 || fk[m][n-1]!='.') left=1;
if (n+1>9 || fk[m][n+1]!='.') right=1;
if (on==1 && und==1 && left==1 && right==1) break;
else
{
int a = rand()%4;
switch(a){
case 0:
if (right!=1)
{
count+=1;
n+=1;
fk[m][n]=alp[count];
}
break;
case 1:
if (und!=1)
{
count+=1;
m+=1;
fk[m][n]=alp[count];
}
break;
case 2:
if (left!=1)
{
count+=1;
n-=1;
fk[m][n]=alp[count];
}
break;
case 3:
if (on!=1)
{
count+=1;
m-=1;
fk[m][n]=alp[count];
}
break;
}
}
}
for (i=0;i<10;i++)
{
for (j=0;j<10;j++)
{
printf("%c ",fk[i][j]);
if (j>0 && j%9==0) printf("\n");
}
}
return 0;
}
代码写出后到“S”就结束了,而且运行结果就只有几种,不知道是哪里出错了。
由于一开始的位置on和left都是1,导致后续不可能向上/左,走到最下面正好上S,所以你需要每次循环重置四个方向参数,比如在else末尾增加:
on = und = left = right = 0;
实测引入了一个新的问题,数据显示不完整,原因是没有在输出所有'A-Z'的字母后退出循环,所以需要在退出的判断中增加一个条件:
if (on==1 && und==1 && left==1 && right==1 || count > 24) break;
经测试无故障,完整代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand((unsigned) time(NULL)); // 使用当前时间作为随机数种子
char fk[10][10];
int i,j;
for (i=0;i<10;i++)
{
for (j=0;j<10;j++)
{
fk[i][j]='.';
}
}
fk[0][0]='A';
char alp[100]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
int m=0,n=0,count=0;
int on=0,und=0,left=0,right=0;
while (1)
{
if (m-1<0 || fk[m-1][n]!='.') on=1;
if (m+1>9 || fk[m+1][n]!='.') und=1;
if (n-1<0 || fk[m][n-1]!='.') left=1;
if (n+1>9 || fk[m][n+1]!='.') right=1;
if (on==1 && und==1 && left==1 && right==1 || count > 24) break;
else
{
int a = rand()%4;
switch(a){
case 0:
if (right!=1)
{
count+=1;
n+=1;
fk[m][n]=alp[count];
}
break;
case 1:
if (und!=1)
{
count+=1;
m+=1;
fk[m][n]=alp[count];
}
break;
case 2:
if (left!=1)
{
count+=1;
n-=1;
fk[m][n]=alp[count];
}
break;
case 3:
if (on!=1)
{
count+=1;
m-=1;
fk[m][n]=alp[count];
}
break;
}
on = und = left = right = 0;
}
}
for (i=0;i<10;i++)
{
for (j=0;j<10;j++)
{
printf("%c ",fk[i][j]);
if (j>0 && j%9==0) printf("\n");
}
}
return 0;
}
【以下回答由 GPT 生成】
我可以为您提供解答。下面是问题的解决方案:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand((unsigned) time(NULL)); // 使用当前时间作为随机数种子
char fk[10][10];
int i, j;
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; j++)
{
fk[i][j] = '.';
}
}
fk[0][0] = 'A';
char alp[26] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
int m = 0, n = 0, count = 0;
int on = 0, und = 0, left = 0, right = 0;
while (count < 26)
{
on = 0;
und = 0;
left = 0;
right = 0;
if (m - 1 < 0 || fk[m - 1][n] != '.') on = 1;
if (m + 1 > 9 || fk[m + 1][n] != '.') und = 1;
if (n - 1 < 0 || fk[m][n - 1] != '.') left = 1;
if (n + 1 > 9 || fk[m][n + 1] != '.') right = 1;
if (!on && !und && !left && !right)
{
int randomIndex = rand() % 26;
switch (alp[randomIndex])
{
case 'A':
fk[m][n] = 'A';
break;
case 'B':
fk[m][n] = 'B';
break;
case 'C':
fk[m][n] = 'C';
break;
case 'D':
fk[m][n] = 'D';
break;
case 'E':
fk[m][n] = 'E';
break;
case 'F':
fk[m][n] = 'F';
break;
case 'G':
fk[m][n] = 'G';
break;
case 'H':
fk[m][n] = 'H';
break;
case 'I':
fk[m][n] = 'I';
break;
case 'J':
fk[m][n] = 'J';
break;
case 'K':
fk[m][n] = 'K';
break;
case 'L':
fk[m][n] = 'L';
break;
case 'M':
fk[m][n] = 'M';
break;
case 'N':
fk[m][n] = 'N';
break;
case 'O':
fk[m][n] = 'O';
break;
case 'P':
fk[m][n] = 'P';
break;
case 'Q':
fk[m][n] = 'Q';
break;
case 'R':
fk[m][n] = 'R';
break;
case 'S':
fk[m][n] = 'S';
break;
case 'T':
fk[m][n] = 'T';
break;
case 'U':
fk[m][n] = 'U';
break;
case 'V':
fk[m][n] = 'V';
break;
case 'W':
fk[m][n] = 'W';
break;
case 'X':
fk[m][n] = 'X';
break;
case 'Y':
fk[m][n] = 'Y';
break;
case 'Z':
fk[m][n] = 'Z';
break;
}
count++;
}
n++;
if (n == 10)
{
n = 0;
m++;
}
if (m == 10)
{
break;
}
}
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; j++)
{
printf("%c ", fk[i][j]);
}
printf("\n");
}
return 0;
}
这段代码首先使用 srand()
函数将当前时间作为随机数种子,然后初始化一个二维数组 fk
用来存储生成的随机字母。 接下来,利用两个嵌套循环将数组的所有元素初始化为 '.'
。然后,在数组的左上角设置初始值为 'A'
。 在 while
循环中,我们检查上、下、左、右四个方向的相邻格子的内容,并根据条件判断是否填充随机字母。 具体实现步骤如下: - 创建变量 on
、und
、left
和 right
,并将其初始化为 0。 - 检查上方格子: 如果 m-1<0
(即没有上方格子)或上方格子不为空(即 fk[m-1][n]!='.'
),则将变量 on
设为 1。 - 检查下方格子: 如果 m+1>9
(即没有下方格子)或下方格子不为空(即 fk[m+1][n]!='.'
),则将变量 und
设为 1。 - 检查左边格子: 如果 n-1<0
(即没有左边格子)或左边格子不为空(即 fk[m][n-1]!='.'
),则将变量 left
设为 1。 - 检查右边格子: 如果 n+1>9
(即没有右边格子)或右边格子不为空(即 fk[m][n+1]!='.'
),则将变量 right
设为 1。 - 如果 on
、und
、left
和 right
都为 0,则表示该格子可以填充随机字母。 - 生成一个随机数 randomIndex
,取值范围是 0 到 25,用来在字母数组 alp
中选择一个字母。 - 使用 switch
语句将 alp[randomIndex]
映射到相应的字母,并将其填充到 fk[m][n]
格子中。 - 将随机字母的数量 count
加 1。 - 将 n
加 1,如果 n
等于 10,则将 n
设为 0,并将 m
加 1。 - 如果 m
等于 10,则退出循环。 最后,使用两个嵌套循环打印二维数组 fk
,并以空格作为分隔符分隔每个元素。 请注意,switch
语句的代码会根据实际情况略有冗长,但其实可以使用更简洁的方式实现,这里只是给出了一种可能的实现方法。 希望这个解决方案可以帮助到您。如果您还有其他问题需要解答,请随时告诉我。
【相关推荐】