问题描述: 在n*n方阵中填入1,2,3,....,n*n,要求填成蛇形状。 如 10 11 12 1 9 16 13 2 8 15 14 3 7 6 5 4 类似上面这种矩阵像蛇一样弯进来的。
分析: 首先,我们碰到矩阵这一类问题,我们可以将里面的数据使用二维数组存储。 其实每一个蛇形矩阵都是从第一行第n列开始的,先向下移动,当发现移动不了(这里的意思是指越界),就开始向左移动,当左边移动不了,就向上移动,向上移动不了就向右移动,向右移动不了就再向下移动,以此类推。 根据上述4*4的矩阵我们先将1存入到矩阵的右上角,模拟开始移动,因为移动的方向只能是下、左、上、右....以此类推。设置四个循环即可。
源代码:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int num[10][10]; int main() { memset(num,0,sizeof(num)); //将矩阵初始化 int n; cout<<"请输入蛇形矩阵的维数:"<<endl; cin>>n; int x = 0; //表示矩阵的行 int y = n-1; //表示矩阵的列 int rs; //表达每一步的值 (1,2,3,4...16) rs = num[x][y] = 1; while(rs<n*n) //这个循环是判断矩阵里的数值不能超过n*n { while(x<n-1 && !num[x+1][y]) //!num[x+1][y]想当于判断向下走是否越界,因为我们给数组初始化为0 { num[++x][y] = ++rs; } while(y>0 && !num[x][y-1]) //!num[x][y-1]相当于判断向左走是否越界 { num[x][--y] = ++rs; } while(x>0 && !num[x-1][y]) //!num[x-1][y]相当于判断向上走是否越界 { num[--x][y] = ++rs; } while(y<n-1 && !num[x][y+1]) //!num[x][y+1]相当于判断向右走是否越界 { num[x][++y] = ++rs; } } for(int i = 0;i<n;i++) { for(int j = 0;j<n;j++) { printf("%3d",num[i][j]); } cout<<endl; } return 0; }
