人有多大胆,地有多大产,大力出奇迹,你们还不明白吗?
代码:
#include <iostream>
#include <cstdio>
using namespace std ;
int main()
{
//定义变量
int n ;
cin >> n ; //输入个数
int i = n ; //第一部分
int ii = i ; //第一部分遍历几次
int j1 = n - 1 ; //第二部分
int jj1 = j1 ; //第二部分遍历几次
int j2 = n - 1 ; //第三部分
int jj2 = j2 ; //第三部分遍历几次
int k = n - 2 ; //第四部分
int kk = k ; //第四部分遍历几次。
//定义数组
int a[n][n] ; //二维数组。
int p = 0 ; //行数
int q = n-1 ; //列数
int num = 0 ; //计数器
//核心代码
while ( num != n*n ) {
//第一部分
while( i > 0 && ii > 0 ) {
a[p][q] = (++num) ;
ii-- ;
p++ ; //列数不变,行数自加
}
i -= 2 ;
ii = i ;
p-- ; //修正过量的行数。
q-- ; //从第一阶段修正到第二阶段
//第二部分
while(j1 > 0 && jj1 > 0) {
a[p][q] = ++num ;
jj1-- ;
q-- ; //行数不变,列数自减
}
j1 -= 2 ;
jj1 = j1 ;
q++ ; //同上
p-- ; //同上
//第三部分
while(j2 > 0 && jj2 > 0) {
a[p][q] = ++num ;
jj2-- ;
p-- ; //列数不变,行数自减
}
j2 -= 2 ;
jj2 = j2 ;
p++ ; //同上
q++ ; //同上
//第四部分
while(k > 0 && kk > 0) {
a[p][q] = ++num ;
kk-- ;
q++ ;
}
k -= 2 ;
kk = k ;
q-- ; //同上
p++ ; //同上
}
for (int i = 0 ; i < n ; i++ ) {
for (int j = 0 ; j < n ; j++ ) {
printf("%3d",a[i][j]) ;
}
cout << endl ;
}/* */
return 0 ;
}
总结
1、本题需要经过两次修正,一次是自加过量的行数或列数的修正,一次是从一部分终点转移到另一部分起点的修正。
2、像这种图案类型的题,一般都会有修正, 有n阶段。