题目描述:
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
解题思路:
这个题目首先看的话:我的想法是分层:这个都是先外层然后内层;然后一层层的排布下去。
按照分层的思路之后,进行编码。
主要碰到的问题:1、首先是按照分层,但是代码比较随意,导致多次迭代的时候,出现第一层正常,第二次修改。第二层修改又导致第一层问题。调试时间有些长
2、基于分层之后,没有立即分析第一层和第二层的位置关系
后面分析了第一层和第二层的位置关系之后,调试就比较顺畅
后面看到了解题:还有一个思路是顺时针,主要是下一个点的位置是由规律,可以顺时针 单个排布
代码:
#include <stdio.h>
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
int** generateMatrix(int n, int* returnSize, int** returnColumnSizes) {
int maxNum = n * n;
int curNum = 1;
int** matrix = malloc(sizeof(int*) * n);
*returnSize = n;
*returnColumnSizes = malloc(sizeof(int) * n);
for (int i = 0; i < n; i++) {
matrix[i] = malloc(sizeof(int) * n);
memset(matrix[i], 0, sizeof(int) * n);
(*returnColumnSizes)[i] = n;
}
int row = 0, column = 0;
int directions[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; // 右下左上
int directionIndex = 0;
while (curNum <= maxNum) {
matrix[row][column] = curNum;
curNum++;
int nextRow = row + directions[directionIndex][0], nextColumn = column + directions[directionIndex][1];
if (nextRow < 0 || nextRow >= n || nextColumn < 0 || nextColumn >= n || matrix[nextRow][nextColumn] != 0) {
directionIndex = (directionIndex + 1) % 4; // 顺时针旋转至下一个方向
}
row = row + directions[directionIndex][0];
column = column + directions[directionIndex][1];
}
return matrix;
}
void generateMatrix1(int num)
{
int matr[20][20]={};
int index=0;
int index1=0;
int index2=1;
int quan_num=0;
if (num%2 ==0)
quan_num = num/2;
else
quan_num = (num-1)/2+1;
printf("num :%d;quan_num:%d\r\n",num,quan_num);
for (index=0;index<quan_num;index++)
{
int temp=0;
int temp1=0;
printf("1:%d\r\n",index);
if (quan_num%2 !=0)
{
if(index == (quan_num-1))
{
break;
}
}
for (index1=0;index1<(num-2*index);index1++)
{
matr[index][index1+index]=index2++;
printf("[%d %d]=%d\r\n",index,index1+index,matr[index][index1+index]);
}
index1--;
temp = index1+index;
printf("2 %d\r\n",temp);
for (index1=(0);index1<(num-2*index-1);index1++)
{
matr[index+index1+1][temp]=index2++;
printf("[%d %d]=%d\r\n",index+index1+1,temp,matr[index+index1+1][temp]);
}
index1 = index1-1;
temp = temp;
temp1 = index+index1+1;
printf("3 %d\r\n",temp);
for (index1=(0);index1<(num-2*index-1);index1++)
{
matr[temp][temp1-index1-1]=index2++;
printf("[%d %d]=%d\r\n",temp,temp1-index1-1,matr[temp][temp1-index1-1]);
}
index1 = index1-1;
temp = temp;
temp1 = temp1-index1-1;
printf("4 %d\r\n",temp);
for (index1=(0);index1<(num-2*index-1-1);index1++)
{
matr[temp-1-index1][temp1]=index2++;
printf("[%d %d]=%d\r\n",temp-1-index1,temp1,matr[temp-1-index1][temp1]);
}
}
if (num%4==0)
{
;
}
else if(num%4==1)
{
matr[(num-1)/2][(num-1)/2]=num*num;
}
else if(num%4==2)
{
matr[(num-2)/2][(num-2)/2]=num*num-3;
matr[(num-2)/2+1][(num-2)/2]=num*num;
matr[(num-2)/2+1][(num-2)/2+1]=num*num-1;
matr[(num-2)/2][(num-2)/2+1]=num*num-2;
}
else if(num%4==3)
{
;
}
printf("\r\n");
for (index=0;index<=19;index++)
{
for (index1=0;index1<=19;index1++)
{
printf("%3d ",matr[index][index1]);
}
printf("\r\n");
}
}
int main(void)
{
int M, T, P;
int num=0;
int index=0;
int index_tmp=0;
int num_str[1000000]={};
scanf("%d", &num);
generateMatrix1(num);
return 0;
}