尝试以这种模式以螺旋形式填充矩阵,并在测试中遇到问题,任何人都可以帮助我吗?我尝试过的代码和想法如下..
创建以下程序:用户首先输入整数矩阵(不大于100)的宽度S和高度V。然后用户输入整数 X 和 Y。
矩阵应填充数字X和Y,如下所示:在矩阵的中间,即坐标[S/2,V/2]处,有数字X(如果坐标为X,则解被识别)中心的偏差与预期值相差 1)。然后用数字 X 螺旋地填充矩阵,首先向左,然后向下,然后向右,然后向上,等等。在这些螺旋之间,为数字 Y 留出空间。S 的矩阵布局示例=9, V=7, X=4 和 Y= 6 如下:
6 6 6 6 6 6 6 6 4
4 4 4 4 4 4 4 6 4
4 6 6 6 6 6 4 6 4
4 6 4 4 4 6 4 6 4
4 6 4 6 6 6 4 6 4
4 6 4 4 4 4 4 6 4
4 6 6 6 6 6 6 6 4
矩阵中心的元素用粗体标记。完成的矩阵应在最后打印在屏幕上。
#include <stdio.h>
int main() {
int matrica[100][100], i, j, s, v, x, y;
printf("Unesite sirinu i visinu matrice: ");
scanf("%d%d", &s, &v);
printf("Unesite X i Y: ");
scanf("%d%d", &x, &y);
int br = 2;
int poc_i = s / 2;
int poc_j = v / 2;
int ind = 1;
while (poc_i < v && poc_j < v) {
for (int i = 0; i < br; i++) {
matrica[poc_i][poc_j] = x;
if (ind % 2 != 0) {
poc_j--;
} else {
poc_j++;
}
}
for (int i = 0; i < br; i++) {
matrica[poc_i][poc_j] = x;
if (ind % 2 != 0) {
poc_i++;
} else {
poc_i--;
}
}
br += 2;
ind++;
}
for (int i = 0; i < s; i++) {
for (int j = 0; j < v; j++) {
if (matrica[i][j] != x) {
matrica[i][j] = y;
}
}
}
for (i = 0; i < v; i++) {
for (j = 0; j < s; j++)
printf("%5d", matrica[i][j]);
printf("\n");
}
return 0;
}
这是代码的更新版本,可以正常工作。
#include <stdio.h>
#include <memory.h>
int main()
{
int matrica[100][100], i, j, s, v, x, y, m;
memset(matrica, 0, sizeof(matrica));
printf("Unesite sirinu i visinu matrice: ");
scanf("%d%d", &s, &v);
printf("Unesite X i Y: ");
scanf("%d%d", &x, &y);
int br = 2;
int poc_i = v / 2;
int poc_j = s / 2;
int ind = 1;
m = (s > v ? s : v);
while (poc_i < m && poc_j < m) {
for (i = 0; i < br; i++) {
if (0 <= poc_i && poc_i < v && 0 <= poc_j && poc_j < s) {
matrica[poc_i][poc_j] = x;
}
if (ind % 2 != 0) {
poc_j--;
} else {
poc_j++;
}
}
for (i = 0; i < br; i++) {
if (0 <= poc_i && poc_i < v && 0 <= poc_j && poc_j < s) {
matrica[poc_i][poc_j] = x;
}
if (ind % 2 != 0) {
poc_i++;
} else {
poc_i--;
}
}
br += 2;
ind++;
}
for (i = 0; i < v; i++) {
for (j = 0; j < s; j++) {
if (matrica[i][j] != x) {
matrica[i][j] = y;
}
}
}
for (i = 0; i < v; i++) {
for (j = 0; j < s; j++)
printf("%5d", matrica[i][j]);
printf("\n");
}
return 0;
}
运行此命令会根据示例输入值给出以下结果:
Unesite Sirinu i visinu 矩阵:9 7
Unesite X i Y:4 6
6 6 6 6 6 6 6 6 4
4 4 4 4 4 4 4 6 4
4 6 6 6 6 6 4 6 4
4 6 4 4 4 6 4 6 4
4 6 4 6 6 6 4 6 4
4 6 4 4 4 4 4 6 4
4 6 6 6 6 6 6 6 4
如您所见,它符合您的要求。您的代码有几个错误,所以我做了以下更改:
您的
matrica
矩阵是在堆栈上分配的,因此默认情况下它包含随机值。但是,您后面的代码假设任何未分配 x
的内容都应设置为 y
。尽管不太可能,但某些未分配的值可能具有 x
值,因此无法正常工作。因此,我添加了行 memset(matrica, 0, sizeof(matrica));
将所有值设置为 0。这假设 x
永远不会为 0,因此如果情况并非如此,您可能希望更改此设置。
根据您输出结果的方式,您的记忆被设置为第一个索引是垂直位置,第二个索引是水平位置,这与正常情况相反。因此,我在初始化
v
和 s
值的行中交换了 poc_i
和 poc_j
值。
宽度和高度尺寸可能有很大不同,因此仅基于高度
while
的v
循环条件可能会过早退出。相反,我们想要使用这些值中的最大值,这是我使用 m = (s > v ? s : v);
线所做的。
用于设置
matrica
矩阵值的索引可能超出范围,因此我添加了检查以确保不会在主 while 循环中更新值的 2 个位置发生这种情况。