关于矩阵的一个题目

本文详细解析了一种矩阵螺旋填充算法的实现思路与代码。通过分析矩阵填充的规律,使用循环遍历的方式,实现了从外向内螺旋式填充矩阵的过程。特别针对不同尺寸的矩阵,包括奇数和偶数行列,提供了完整的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记录下。
题目要求:一个矩阵n行m列,输出如下的矩阵
比如,n = 4, m = 5
0 1 2 3 4
13 14 15 16 5
12 19 18 17 6
11 10 9 8 7
比如, n = 3, m = 4
0 1 2 3
9 10 11 4
8 7 6 5

我的思路,从下标找下规律,相当于有几个圈,而每个圈的终止条件为当i值为初始的i值+1,j为初始的j值时,一圈结束。比如,第一个初始的下标为(0,0),则结束的下标为(1,0)。然后新的一圈的下标初始为(1,1),则结束的下标为(2,1)。圈数为n值的一半。最后填充下被while条件除掉的一个值。如果n为奇数,也要进行最中间一行数值的填充。

代码实现:

package baiao;

public class Test3 {
	public static void main(String[] args) {
		print(8, 9);
		
	}
	public static void print(int n, int m) {
		int[][] a = new int[n][m]; 
		int ibegin = 0;//for循环的初始条件
		int jbegin = 0;
		int iend = n - 1;
		int jend = m - 1;
		int icircle = 0;//while 循环开始
		int jcircle = 0;
		int i = 0;//while循环里变化的i
		int j = 0;
		int tmp = 0;//矩阵填充的值
		//System.out.println("\\\\");
		for(int k = 0; k < n / 2; k++) {
			//System.out.println(k + " ");
			while(!(i == icircle + 1 && j == jcircle)){
				//System.out.println("tmp: " + tmp);
				if(j < jend && i == ibegin) {
					a[i][j] = tmp;
					//System.out.println("1i,j" + i + " " + j + "a" +  a[i][j]);
					tmp++;
					j++;
				}
				else if(j == jend && i < iend) {
					a[i][j] = tmp;
					//System.out.println("2i,j" + i + " " + j + "a" +  a[i][j]);
					tmp++;
					i++;
				}
				else if(j > jbegin && i == iend) {
					a[i][j] = tmp;
					//System.out.println("3i,j" + i + " " + j + "a" +  a[i][j]);
					tmp++;
					j--;
				}
				else if(i > ibegin) {
					a[i][j] = tmp; 
					//System.out.println("4i,j" + i + " " + j + "a" +  a[i][j]);
					tmp++;
					i--;
				}
				
				}//一圈完成
			icircle++;
			jcircle++;
			ibegin++;
			jbegin++;
			iend--;
			jend--;
			//System.out.println(icircle + " " + jcircle + " " + ibegin + " " + jbegin + " " + iend + " " + jend + " ");
		}//for结束
		a[i][j] = tmp;//i==icircle + 1,j == jcircle值的填充
		tmp++;
		//System.out.println( jbegin + " " + jend);
		//当n为奇数时,补充最中间的一行
		if(n % 2 != 0) {
			for(j = jbegin; j <= jend; j++) {
				a[i][j] = tmp;
				tmp ++;
			}
		}
		//输出矩阵
		for(int k1 = 0; k1 < n ; k1++) {
			for(int k2 = 0; k2 < m; k2++) {
				System.out.print(a[k1][k2] + " ");
			}
			System.out.println();
		}
	}
}

输出

0 1 2 3 4 5 6 7 8 
29 30 31 32 33 34 35 36 9 
28 51 52 53 54 55 56 37 10 
27 50 65 66 67 68 57 38 11 
26 49 64 71 70 69 58 39 12 
25 48 63 62 61 60 59 40 13 
24 47 46 45 44 43 42 41 14 
23 22 21 20 19 18 17 16 15 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值