#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>
int main() {
bool N1[10][10] = {false}; //定义一个检验是否有字母的布尔矩阵
char N[10][10] = {'.'}; //定义一个字符矩阵
for (int i = 0; i < 10; i++) { //对矩阵初始化'.'
for (int j = 0; j < 10; j++) {
N[i][j] = '.';
}
}
srand((unsigned) time(NULL)); // 重置时间
int ways; //用来判断走哪条路
int i = 0, j = 0; //指定初始位置和用于判断之后的位置(x轴为i,y轴为j)
N[0][0] = 'A'; //指定初始位置的字母
N1[0][0] = true; //指定初始位置布尔值是真
for (int alphabet = 1; alphabet <= 25;) { //对于每一个字母
ways = rand() % 4; //先判断走那条路(上, 下, 左, 右)
if ( ways == 0) { // 如果走上面
if (j - 1 < 0) { //如果遇到边界
continue; //跳过剩下的在找一条路
} else if (N1[i][j - 1] == true) { //如果上面有字母
if ((N[i - 1][j] == true && N[i + 1][j] == true && N[i][j + 1] == true) || // 六种情况
(N[i - 1][j] == true && N[i][j + 1] == true && i + 1 > 9 ) ||
(N[i - 1][j] == true && i + 1 > 9 && j + 1 > 9) ||
(i - 1 < 0 && N[i + 1][j] == true && N[i][j + 1] == true) ||
(i - 1 < 0 && j + 1 > 9 && N[i + 1][j] == true) ||
(N[i - 1][j] == true && N[i + 1][j] == true && j + 1 > 9))
continue; //遇到6种堵死的情况跳出这次循环去下一次循环找路
} else {
N[i][j - 1] = 'A' + alphabet;
N1[i][j - 1] = true;
alphabet++;
j--;
}
}
if ( ways == 1) { //如果走右边
if (i + 1 > 9) { //如果遇到边界
continue;
} else if (N1[i + 1][j] == true) { //如果上面有字母
if ((N[i][j - 1] == true && N[i - 1][j] == true && j + 1 > 9) ||
(N[i][j - 1] == true && i - 1 < 0 && j + 1 > 0) ||
(N[i][j + 1] == true && N[i][j - 1] == true && i - 1 < 0) ||
(j - 1 < 0 && N[i - 1][j] == true && N[i][j + 1] == true) ||
(j - 1 < 0 && i - 1 < 0 && N[i][j + 1] == true) ||
(N[i][j + 1] == true && N[i][j - 1] == true && N[i - 1][j] == true))
continue;
} else {
N[i + 1][j] = 'A' + alphabet;
N1[i + 1][j] = true;
alphabet++;
i++;
}
}
if (ways == 2) { //如果走下面
if (j + 1 > 9) {
continue;
} else if (N1[i][j + 1] == true) {
if ((N[i][j - 1] == true && N[i - 1][j] == true && N[i + 1][j] == true) ||
(N[i - 1][j] == true && N[i][j - 1] == true && i + 1 > 9) ||
(N[i - 1][j] == true && i - 1 < 0 && j + 1 > 0) ||
(N[i + 1][j] == true && N[i][j - 1] == true && i - 1 < 0) ||
(i - 1 < 0 && j - 1 < 0 && N[i + 1][j] == true) ||
(N[i - 1][j] == true && N[i + 1][j] == true && j - 1 < 0))
continue;
} else {
N[i][j + 1] = 'A' + alphabet;
N1[i][j + 1] = true;
alphabet++;
j++;
}
}
if (ways == 3) { //如果走左边
if (i - 1 < 0) {
continue;
} else if (N1[i - 1][j] == true) {
if ((N[i][j - 1] == true && N[i][j + 1] == true && i + 1 > 9) ||
(N[i][j - 1] == true && N[i + 1][j] == true && j + 1 > 9) ||
(N[i][j - 1] == true && i + 1 > 9 && j + 1 > 9) ||
(j - 1 < 0 && j + 1 > 9 && N[i + 1][j] == true) ||
(j - 1 < 0 && N[i + 1][j] == true && N[i][j + 1] == true) ||
(j + 1 < 0 && i + 1 > 9 && N[i][j + 1] == true))
continue;
} else {
N[i - 1][j] = 'A' + alphabet;
N1[i - 1][j] = true;
alphabet++;
i--;
}
}
}
for (int x = 0; x < 10; x++) {
for (int y = 0; y < 10; y++) {
printf("%c ", N[x][y]);
if (y == 9) {
printf("\n");
}
}
}
return 0;
}