螺旋数组

本文介绍了几种螺旋数组的生成方法,包括一维数组和二维数组的实现方式。通过不同的循环和条件判断,实现了数值按螺旋顺序填充到数组中。代码示例清晰地展示了算法的具体实现过程。
#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值