https://leetcode.cn/problems/spiral-matrix-ii/description/

<aside> 💡

整体思路:设计四堵墙,靠着墙绕圈,碰到墙就拐弯

实现思路:四堵墙对应四个变量,另设一个变量控制前进方向

// 设计一个switch,判断此时在上下左右哪条边移动
// 注意一条边上的最后一个节点留给邻边(循环不变量,每条边都是左闭右开)
vector<vector<int>> generateMatrix(int n) {
	vector<vector<int>> ans(n, vector<int>(n, 0));
	char choice = 't';		// 模拟前进的方向,先从上边界开始走
	int t = 0;			  // 上边界
	int b = n - 1;		// 下边界
	int l = 0;			  // 左边界
	int r = n - 1;		// 右边界

	int num = 1;
	int i = 0, j = 0;

	while (num <= n * n) {
		ans[i][j] = num;
		switch (choice) {
		// 靠着顶边走
		case 't': {
			++j;
			// 碰到墙就右拐,把上边往里缩一格,下面同理
			if (j == r) {
				choice = 'r';
				++t;
			}
			break;
		}
		// 靠着右边走
		case 'r': {
			++i;
			if (i == b) {
				choice = 'b';
				--r;
			}
			break;
		}
		// 靠着下边走
		case 'b': {
			--j;
			if (j == l) {
				choice = 'l';
				--b;
			}
			break;
		}
		// 靠着左边走
		case 'l': {
			--i;
			if (i == t) {
				choice = 't';
				++l;
			}
			break;
		}
		}
		++num;
	}
	return ans;
}

<aside> 💡

卡哥的思路:定义一个大循环,每个循环走一圈。每个大循环中有四个小循环,每个小循环走一条边

实现重点:定义好循环不变量——每条边的变量规则都应相同(一条边上的最后一个节点留给邻边,即每条边都是左闭右开)

</aside>