蛇形矩阵详解

版权声明:@ly https://blog.csdn.net/lytwy123/article/details/83385743

问题描述:
在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;
}

猜你喜欢

转载自blog.csdn.net/lytwy123/article/details/83385743