这是一个完整的 Java 解决方案。您可以轻松地将其转换为 C++。从一个预定义为全 0 的空矩阵开始,如果点 (x,y) 位于一个圆圈内,则用 1 填充它,否则用 9 填充外圆。 (为什么是 9 - 只是为了让您在矩阵中清楚地看到圆圈)。下面的代码适用于奇数大小的矩阵。如果有人有更好的解决方案,请告诉我。
private static void drawCircle(int[][] emptyMatrix, int diameter) {
int startX = diameter/2;
int startY = diameter/2;
int radius = diameter/2;
drawCircleRecursive(emptyMatrix, diameter, startX, startY, radius, radius);
System.out.println("Filled matrix: ");
for (int i = 0; i < emptyMatrix.length; i++) {
for (int j = 0; j < emptyMatrix[0].length; j++) {
System.out.print(emptyMatrix[i][j] + " ");
}
System.out.println();
}
}
private static void drawCircleRecursive(int[][] emptyMatrix, int d, int startX, int startY, int x, int y) {
if(x >= emptyMatrix.length || y >= emptyMatrix[0].length || x < 0 || y < 0 || emptyMatrix[x][y] == 1)
return;
else if(emptyMatrix[x][y] == 9)
return;
int r = d/2;
if (((x - startX) * (x - startX) + (y - startY) * (y - startY)) <= (r * r))
emptyMatrix[x][y] = 1;
else
emptyMatrix[x][y] = 9;
drawCircleRecursive(emptyMatrix, d, startX, startY, x+1, y); // down
drawCircleRecursive(emptyMatrix, d, startX, startY, x, y+1); // right
drawCircleRecursive(emptyMatrix, d, startX, startY, x-1, y); //up
drawCircleRecursive(emptyMatrix, d, startX, startY, x, y-1); //left
drawCircleRecursive(emptyMatrix, d, startX, startY, x-1, y-1); // diagonal up-left
drawCircleRecursive(emptyMatrix, d, startX, startY, x+1, y+1); // diagonal right-down
drawCircleRecursive(emptyMatrix, d, startX, startY, x+1, y-1); // diagonal left-down
drawCircleRecursive(emptyMatrix, d, startX, startY, x-1, y+1); // diagonal right-up
}