整体思路:如上图一样,从第一行第一个开始移动然后如此往复,每一次循环内部移动四次,每次一行或者一列,先向右,再向下,再向左,再向上,将这四个步骤不断循环直到所有格子全部填充完,但要考虑边界问题,每次枚举完一行或者一列行下标或者列下标会超出边界一个距离所以要减一
#include<iostream> #include<algorithm> #include<cstdio> using namespace std; const int N = 15; int g[N][N]; int n; void print()//打印最后结果 { for(int i =1;i<=n-1;i++) { for(int j = 1;j<=n;j++) { printf("%3d",g[i][j]); } cout << endl; } for(int i = 1;i<=n;i++) printf("%3d",g[n][i]); } int main(void) { cin>>n; int st = n*n;//总数 int cnt = 1;//计数 int i = 1,j = 1; while(cnt-1 != st)//因为是后缀加所以最后结束一定是cnt == n^2+1;比如n==5那么最后结束cnt==26 { while(!g[i][j]&&j<=n)g[i][j++] = cnt++;//从第一行开始一直执行到第一行结尾,这个时候的j已经超出了n,所以需要让列减一,让行加一 j--,i++; while(!g[i][j]&&i<=n)g[i++][j] = cnt++;//从第二行末尾开始往下执行执行到最后一行末尾结束,这个时候的行超出了n所以需要减一,让行加一 i--,j--; while(!g[i][j]&&j>=1)g[i][j--] = cnt++;//同上面两个,从最后一行末尾向前执行 j++,i--; while(!g[i][j]&&i>=1)g[i--][j] = cnt++;//同上,从最后一行第一个开始向上循环,不断重复这个过程 i++,j++; } print(); return 0; }