//题目说明
//蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。
//样例输入
//5
//样例输出
//1 3 6 10 15
//2 5 9 14
//4 8 13
//7 12
//11
//接口说明
//原型
//void GetResult(int Num, char * pResult);
//输入参数:
// int Num:输入的正整数N
//输出参数:
// int * pResult:指向存放蛇形矩阵的字符串指针
// 指针指向的内存区域保证有效
//返回值:
// void
//输入描述:
//输入正整数N(N不大于100)
//输出描述:
//输出一个N行的蛇形矩阵。
//
//输入例子:
//4
//输出例子:
//1 3 6 10
//2 5 9
//4 8
第二种方法 :
//蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。
//样例输入
//5
//样例输出
//1 3 6 10 15
//2 5 9 14
//4 8 13
//7 12
//11
//接口说明
//原型
//void GetResult(int Num, char * pResult);
//输入参数:
// int Num:输入的正整数N
//输出参数:
// int * pResult:指向存放蛇形矩阵的字符串指针
// 指针指向的内存区域保证有效
//返回值:
// void
//输入描述:
//输入正整数N(N不大于100)
//输出描述:
//输出一个N行的蛇形矩阵。
//
//输入例子:
//4
//输出例子:
//1 3 6 10
//2 5 9
//4 8
//7
此题目要求的是打印蛇形矩阵,其思路的关键是确定要求的下一个位置的点和已知点的关系。本题中给出两种解答方法,但是两种方法的思路基本上是一致的,都是通过先确定第一行或者第一列的数值,然后依次推出其位置处的值。说明:第一种方法在牛客网站可以测试通过,但第二种方法只能在本机测试通过,在牛客网站测试不通过。自己也没找出原因,若测试通过的朋友可以留言。
第一种方法:
package test;
import java.util.Scanner;
public class NC_035_蛇形矩阵 {
public static void main(String args[]){
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
StringBuilder builder = new StringBuilder();
for (int i = 1; i <= n; i++) {
// 每一行的第一个元素是(i-1)*i/2+1
// 每一行的元素个数是n-i
// 初始间隔是i+1,之后每一个间隔比上一个间隔多1,之后的每个元素是前一个元素加上间隔
for (int j = 1, start = (i - 1) * i / 2 + 1, step = i + 1;
j <= n - i + 1; j++, start += step, step++) {
builder.append(start).append(' ');
}
// 设置换行符
builder.setCharAt(builder.length()-1, '\n');
}
System.out.print(builder.toString());
}
}
}
第二种方法 :
import java.util.Scanner;
public class NC_035_蛇形矩阵 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int n = sc.nextInt();
if(n < 0 || n > 100){
return ;
}
int[][] result = new int[n][n];
GetResult(n,result);
}
}
public static void GetResult(int N,int[][] result){
result[0][0] = 1;
for(int i = 1; i < N; i++){
result[i][0] = result[i-1][0] + i;//先计算出第一列数字
result[0][i] = result[0][i-1] + i + 1;//计算出第一行数字
for(int j = 1; j <= N; j++){
if(i + j < N)//由于只对矩阵的上三角进行赋值操作,故要满足i+j<N
result[i][j] = result[i][j-1] + i + j + 1;//关键是找出(i,j)和(i,j-1)的函数关系
}
}
for(int i = 0; i < N; i++){
for(int j = 0; j< N; j++){
if(i+j < N)//只显示矩阵的上三角部分
System.out.print(result[i][j] + " ");
}
System.out.println();
}
}
}
注:这两种方法的本质都是一样的,在算法的实现过程中时间复杂度都是O(n^2)级别的,自己在测试过程中想找出在O(n)级别时间内打印的结果,及让打印出的最大值n*(n+1)/2作为控制循环的条件,但是一直都没有实现,如果有朋友感兴趣或者测试通过O(n)级别的时间打印出来,可以留言一起交流。