题目
思路
其实看到的第一眼我是想利用递归来求解的,但是它这个数圈很奇怪,不是很好利用第n-1个数圈推出第n个数圈。所以就模拟一个一个的暴力打出来。两点在于定义了一个拐角变量turn。因为这个题目的关键就是得到了第n-1个数圈后怎么将打印的方向拐过来,继续打印第n个数圈。每个对应的n应该具备两个这样的拐角点。每4个后就重新回到了原来的打印方向,所以用swich语句来写即可。
代码
#include <iostream>
using namespace std;
int main() {
int len, n1, n2;
cin >> len;
//记录一下起始点
n1 = (len - 1) / 2;
n2 = n1;
//把二维数组开出来
int arr[len][len] = {0}; //初始化为0
int turn = 1, s = 1;
//下面需要确定转弯点
for (int i = 1; i <= len * len; i++) {
//需要对i进行判断
if (i == s * s) {
s++;
}
arr[n1][n2] = i;
switch (turn) {
case 1:
n2++;
break;
case 2:
n1++;
break;
case 3:
n2--;
break;
case 4:
n1--;
break;
}
if (i + 1 == s * s - (s - 1) || i + 1 == s * s - 2 * (s - 1)) {
//判断转弯数每个n应该有两个转弯数
turn++;
}
if (turn > 4) {
turn = 1;
}
}
for (int i = 0; i < len; i++) {
for (int j = 0; j < len; j++) {
cout << arr[i][j] << ' ';
}
cout << endl;
}
}
收获
还是多做做模拟题啦,提升代码能力,很多题我有思路,但是无法通过代码来实现。