c++ 螺旋打印

面试题

输入一个整数n,从中心而外螺旋打印


输入 2

输出

9 2 3

8 1 4

7 6 5


思路分析:

123.png


如上图所示,先确定每一圈的范围,如n=3时,最外圈的范围是(0,0)~(4,4),即是x,y的取值在0-4之间,第二圈的范围是从

(1,1)~ (3,3),代码要做到事就是确定范围之后,从左上角开始,逆时针填数。

 void Spin(int n)
 {
	 int* arr = new int[(2 * n - 1)*(2 * n - 1)];
	
	 int cols = 2 * n - 1;
	 int rows = 2 * n - 1;
	 int num = cols * rows;
	 memset(arr, 0, num * sizeof(int));
	 for (int i = 0; i < n; ++i)
	 {
		 int max = n-i+1;
		 if (max == i)
			 arr[i*cols + i] = 1;

		 //从上到下
		 for (int j = i; j <= max; ++j)
		 {
			 arr[j*cols+i] = num;
			 --num;
		 }
		 //从左到右
		 for (int j = i + 1; j <= max; ++j)
		 {
			 arr[max*cols + j] = num;
			 --num;
		 }

		 //从下到上
		 for (int j = max-1; j >= i; --j)
		 {
			 arr[j*cols + max] = num;
			 --num;
		 }
		 //从右到左
		 for (int j = max-1; j >= i+1; --j)
		 {
			 arr[i*cols + j] = num;
			 --num;
		 }
	 }
	 //打印
	 cout << "===================>" << endl;
	 for (int i = 0; i < 2 * n - 1; ++i)
	 {
		 for (int j = 0; j < 2 * n - 1; ++j)
		 {
			 cout << arr[i*cols + j] << " ";
		 }
		 cout << endl;
	 }
 }


0
313