各种蛇形矩阵

11 篇文章 0 订阅
8 篇文章 0 订阅
/*
1  2  3  4  5 
16 17 18 19 6 
15 24 25 20 7 
14 23 22 21 8 
13 12 11 10 9 
*/
void serpentineArray(vector<int> array, int n, vector<vector<int>> &out) {
	int count = 0;
	if(n==1){
		out[0][0]=array[count++];
	}	
	else{
		for(int i=0;i<n/2;i++){
			/* 以下循环执行后输出如下: 
	            1 2 3 4 5 
				*/  
			for(int j=i;j<n-i;j++){
				out[i][j]=array[count++];
			}
				/* 以下循环执行后输出如下: 
	            1 2 3 4 5 
	                    6 
	                    7 
	                    8 
				*/  
				
			for(int k=i+1;k<n-i-1;k++){
				out[k][n-i-1]=array[count++];
			}
				
				/* 以下循环执行后输出如下: 
		        1  2  3  4  5 
		                    6 
		                    7 
		                    8 
		        13 12 11 10 9    
		    */  
			for(int m=n-i-1;m>i;m--){
				out[n-i-1][m]=array[count++];
			}
				
				/* 以下循环执行后输出如下: 
		        1  2  3  4  5 
		        16          6 
		        15          7 
		        14          8 
		        13 12 11 10 9 
		    */  
			for(int w=n-i-1;w>i;w--){
				out[w][i]=array[count++];
			}
		}
			
			/* 上面的大循环执行后输出如下: 
	        1  2  3  4  5 
	        16 17 18 19 6 
	        15 24    20 7 
	        14 23 22 21 8 
	        13 12 11 10 9 
	    */  
		if(n%2 == 1){  
		    //如果n值奇数,将最中间的空填上  
		    out[n/2][n/2] = array[count++];  
		}  
	}	
}
/*
	1  3  4  10 11
	2  5  9  12 19
	6  8  13 18 20
	7  14 17 21 24
	15 16 22 23 25
*/
void serpentineArray2(vector<int> array, int n, vector<vector<int>> &result) {
	vector<vector<int>> out(n * 2 - 1,vector<int>(n));
	int count = 0;
	//构造三角阵数形
	/*
		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
	*/
	for(int i=0;i<n-1;i++)
	{
		for(int j=0;j<=i;j++)
		{
			out[i][j]=array[count++];
		}
	}

	for(int i=n-1;i<2*n-1;i++)
	{
		for(int j=0;j<2*n-1-i;j++)
		{
			out[i][j]=array[count++];
		}
	}

	/*
		1
		2  3
		6  5  4
		7  8  9  10
		15 14 13 12 11
		16 17 18 19
		22 21 20
		23 24
		25
	*/

	//奇数行进行逆序排序
	for(int i=0;i<n;i+=2) //第0、2、4行
	{
		int temp=0;
		for(int j=0;j<=i/2;j++)
		{
			temp=out[i][j];
			out[i][j]=out[i][i-j];
			out[i][i-j]=temp;
		}
	}

	for(int i=(n+1)/2*2;i<2*n-1;i+=2) //第6、8行
	{
		int temp=0;
		for(int j=0;j<(2*n-1-i)/2;j++)
		{
			temp=out[i][j];
			out[i][j]=out[i][2*n-2-i-j];
			out[i][2*n-2-i-j]=temp;
		}
	}
	/*
		1  3  4  10 11
		2  5  9  12 19
		6  8  13 18 20
		7  14 17 21 24
		15 16 22 23 25
	*/
	//按照斜线将数填回原矩阵
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<=i;j++)
		{
			result[i-j][j]=out[i][j];
		}
	}

	for(int i=n;i<2*n-1;i++)
	{
		for(int j=i-n+1;j<n;j++)
		{
			result[i-j][j]=out[i][j-i+n-1];
		}
	}
}
/*
	1  2  3  4  5 
	16 17 24 23 6 
	15 18 25 22 7 
	14 19 20 21 8 
	13 12 11 10 9 
*/
void makematrix(int &N, vector<vector<int>> &matrix, int &K, int &layers, int &posi,int &posj)
{
	if(N == 0)
	{
		return;
	}
	if(N == 1)
	{
		matrix[posi][posj] =K;
		return;
	}
	if(layers%2 != 0) //逆时针
	{
		for(int i = 0; i < N; i++)
		{
			matrix[posi][posj] = K;
			posi++;
			K++;
		}
		posi--;
		posj++;
		for(int i = 0; i < N-1; i++)
		{
			matrix[posi][posj] = K;
			posj++;
			K++;
		}
		posj--;
		posi--;
		for(int i = 0; i < N-1; i++)
		{
			matrix[posi][posj] = K;
			posi--;
			K++;
		}
		posi++;
		posj--;
		for(int i = 0; i < N-2; i++)
		{
			matrix[posi][posj] = K;
			posj--;
			K++;
		}
		posi++;
		posj++;

	}else//顺时针
	{
		for(int i = 0; i < N; i++)
		{
			matrix[posi][posj] = K;
			posj++;
			K++;
		}
		posj--;
		posi++;
		for(int i = 0; i < N-1; i++)
		{
			matrix[posi][posj] = K;
			posi++;
			K++;
		}
		posi--;
		posj--;
		for(int i = 0; i < N-1; i++)
		{
			matrix[posi][posj] = K;
			posj--;
			K++;
		}
		posj++;
		posi--;
		for(int i = 0; i < N-2; i++)
		{
			matrix[posi][posj] = K;
			posi--;
			K++;
		}
		posi++;
		posj++;
	}
	layers++;
	N = N - 2;
	makematrix(N,matrix,K,layers,posi,posj);
}
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值