#include <stdio.h>
// for n<=13 is ok, otherwise will run ok but the array is not completely
void SpiralArray()
{
const int n = 13;
const int size = n * n;
int a[size] = {0};
// 0
for (int i = 0; i < n; ++i)
{
a[i] = i + 1;
}
int value = n; // (n-1) and (n-1) repeated, but don't worry
for (int i = n - 1; i < size; i += n)
{
a[i] = value++;
}
for (int i = size - 2; i >= size - n; --i)
{
a[i] = value++;
}
for (int i = size - 2 * n; i >= n; i -= n)
{
a[i] = value++;
}
// 1
for (int i = n + 1; i < 2 * n - 1; ++i)
{
a[i] = value++;
}
for (int i = 3 * n - 2; i < size - n - 1; i += n)
{
a[i] = value++;
}
for (int i = size - 3 - n; i >= size - 2 * n + 1; --i)
{
a[i] = value++;
}
for (int i = size - 3 * n + 1; i >= 2 * n; i -= n)
{
a[i] = value++;
}
// 2
for (int i = 2 * n + 2; i < 3 * n - 2; ++i)
{
a[i] = value++;
}
for (int i = 4 * n - 3; i < size - 2 * n - 2; i += n)
{
a[i] = value++;
}
for (int i = size - 4 - 2 * n; i >= size - 3 * n + 2; --i)
{
a[i] = value++;
}
for (int i = size - 4 * n + 2; i >= 3 * n; i -= n)
{
a[i] = value++;
}
// 3
for (int i = 3 * n + 3; i < 4 * n - 3; ++i)
{
a[i] = value++;
}
for (int i = 5 * n - 4; i < size - 3 * n - 3; i += n)
{
a[i] = value++;
}
for (int i = size - 5 - 3 * n; i >= size - 4 * n + 3; --i)
{
a[i] = value++;
}
for (int i = size - 5 * n + 3; i >= 4 * n; i -= n)
{
a[i] = value++;
}
// 4
for (int i = 4 * n + 4; i < 5 * n - 4; ++i)
{
a[i] = value++;
}
for (int i = 6 * n - 5; i < size - 4 * n - 4; i += n)
{
a[i] = value++;
}
for (int i = size - 6 - 4 * n; i >= size - 5 * n + 4; --i)
{
a[i] = value++;
}
for (int i = size - 6 * n + 4; i >= 5 * n; i -= n)
{
a[i] = value++;
}
// 5
for (int i = 5 * n + 5; i < 6 * n - 5; ++i)
{
a[i] = value++;
}
for (int i = 7 * n - 6; i < size - 5 * n - 5; i += n)
{
a[i] = value++;
}
for (int i = size - 7 - 5 * n; i >= size - 6 * n + 5; --i)
{
a[i] = value++;
}
for (int i = size - 7 * n + 5; i >= 6 * n; i -= n)
{
a[i] = value++;
}
// 6
for (int i = 6 * n + 6; i < 7 * n - 6; ++i)
{
a[i] = value++;
}
// print the array
for (int i = 0; i < size; ++i)
{
if ((i != 0) && (i % n == 0))
{
printf("\n");
}
printf("%03d ", a[i]);
}
printf("\n");
}
// SpiralArray: Advanced version
void MySpiralArray()
{
const int n = 17;
const int size = n * n;
int value = 1;
int a[size] = {0};
for (int j = 0; j <= n / 2; ++j)
{
for (int i = j * n + j; i < (j + 1) * n - j; ++i)
{
a[i] = value++;
}
if (j == 0)
{
value--; // (n-1) and (n-1) repeated
for (int i = n - 1; i < size; i += n)
{
a[i] = value++;
}
}
else
{
for (int i = (j + 2) * n - (j + 1); i < size - j * (n + 1); i += n)
{
a[i] = value++;
}
}
for (int i = size - (j + 2) - j * n; i >= size - (j + 1) * n + j; --i)
{
a[i] = value++;
}
for (int i = size - (j + 2) * n + j; i >= (j + 1) * n; i -= n)
{
a[i] = value++;
}
}
// print the array
for (int i = 0; i < size; ++i)
{
if ((i != 0) && (i % n == 0))
{
printf("\n");
}
printf("%03d ", a[i]);
}
printf("\n");
}
void SpiralArray2()
{
const int ROW = 4;
const int COL = 4;
int a[ROW][COL]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
int b[ROW][COL]={0};//记录此元素有没有被访问过,访问过就置1
int count =0;
int direct = 1;
int row = 0;
int col = -1;
for (int i = 0; i < ROW; ++i)
{
for (int j = 0; j < COL; ++j)
{
printf("%03d ", a[i][j]);
}
printf("\n");
}
while(count<COL*ROW)
{
// left to right
col++;
while(col<COL && b[row][col]==0)//如果没有访问过,就访问,并且置访问位 = 1
{
printf("%03d ", a[row][col]);
b[row][col] = 1;
col++;
count++;
}
col--;//因为上面循环退出的话,说明要么col越界,要么访问了已经访问过的元素,所以col应该往回退1
//top to down
row++;
while(row<ROW && b[row][col]==0)
{
printf("%03d ", a[row][col]);
b[row][col] = 1;
row++;
count++;
}
row--;
//right to left
col--;
while(col>=0 && b[row][col]==0)
{
printf("%03d ", a[row][col]);
b[row][col] = 1;
col--;
count++;
}
col++;
//down to top
row--;
while(row>=0 && b[row][col]==0)
{
printf("%03d ", a[row][col]);
b[row][col] = 1;
row--;
count++;
}
row++;
}
printf("\n");
}
#define M 4
#define N 4
void SpiralArray3()
{
int a[M][N];
int m = M, n = N;
int i,j;
int t;
int up=0,down=m-1;
int left=0,right=n-1;
i=up,j=left;
t=1;
while(1)
{
while(j != right+1)
{
a[i][j]=t;
t++;
j++;
}
j--;
if((t-1) == (m*n))
{
break;
}
up++;
i=up;
while(i != down+1)
{
a[i][j]=t;
t++;
i++;
}
if((t-1) == (m*n))
{
break;
}
i--;
right--;
j=right;
while(j != left-1)
{
a[i][j]=t;
t++;
j--;
}
if((t-1) == (m*n))
{
break;
}
j++;
down--;
i=down;
while(i != up-1)
{
a[i][j]=t;
t++;
i--;
}
if((t-1) == (m*n))
{
break;
}
i++;
left++;
j=left;
}
for(i = 0; i < m; i++)
{
for(j = 0; j < n; j++)
{
printf("%03d ",a[i][j]);
}
printf("\n");
}
}
int main()
{
// The function of mine
// One-dimensional array: SpiralArray() and MySpiralArray()
SpiralArray();
printf("\n");
MySpiralArray();
printf("\n");
// The function of others
// Two-dimensional array: SpiralArray2() and SpiralArray3()
SpiralArray2();
printf("\n");
SpiralArray3();
return 0;
}
螺旋数组
最新推荐文章于 2022-07-12 20:24:47 发布
