【问题描述】
蛇形填数
在n×n方阵里填入1,2,…,n×n,要求填成蛇形。例如,n=4时方阵为:
1 2 3 4 5 6 7
   |  1  2  3  4
  12 13 14  5
  11 16 15  6
  10  9  8  7
   | 
 
为了美化效果,我们设置每个数宽度为4,填充符号为*。先输入n值,n≤10。
【样例输入】
【样例输出】
1 2 3 4 5 6 7
   | ***1***2***3***4
  **12**13**14***5
  **11**16**15***6
  **10***9***8***7
   | 
 
分析:
总循环次数为n / 2,每一次循环打印一圈,每一圈分为四条边,每条边的定位和长度与循环的当前次数关联
ps:使用动态二维数组可以保证n的值随意设定;要使用普通二维数组的话把num重新定义并删除初始化动态二维数组即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
   | #include <iostream> #include <iomanip> #include <vector>
  using namespace std;
  int main() { 	int n, res = 1; 	vector<vector<int>> num; 	vector<int> temp; 	cin >> n;      	for (int i = 0; i < n; ++i) 	{ 		temp.clear(); 		for (int j = 0; j < n; ++j) 		{ 			temp.push_back(0); 		} 		num.push_back(temp); 	}
  	for (int i = 0; i <= n / 2; ++i)	 	{ 		for (int j = i; j < n - i - 1; ++j) 		{ 			num[i][j] = res++; 		}	 		for (int j = i; j < n - i - 1; ++j) 		{ 			num[j][n - i - 1] = res++; 		}	 		for (int j = n - i - 1; j > i; --j) 		{ 			num[n - i - 1][j] = res++; 		}	 		for (int j = n - i - 1; j > i; --j) 		{ 			num[j][i] = res++; 		}	 	} 	if (n % 2 != 0) 		num[n/2][n/2] = res;	
  	for (int i = 0; i < n; ++i) 	{ 		for (int j = 0; j < n; ++j) 		{ 			cout << setw(4) << setfill('*') << right << num[i][j]; 		} 		cout << endl; 	}
  	return 0; }
   |