在一行上输入一个整数
代表矩阵的大小。
输出一个
行
列的上三角蛇形矩阵。
4
1 3 6 10 2 5 9 4 8 7
第一步,
,将
;
第二步,
,将
、
;
第三步,
,将
、
、
;
第四步,
,将
、
、
、
。
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[][] arr = set(n);
//System.out.println(n);
StringBuilder sb = new StringBuilder();
for(int i=0; i<n; i++){
for(int j=0; j<n-i; j++){
sb.append(arr[i][j]).append(" ");
}
sb.append("\r\n");
}
System.out.println(sb.toString());
br.close();
}
public static int[][] set(int n){
int[][] arr = new int[n][n];
int y=0, m=0;//y为横坐标,m表示坐标上的值
for(int i=0; i<n; i++){//i为斜着的行
y = i;
while(y>=0){
arr[y][i-y] = ++m;
y--;
}
}
return arr;
}
} 2.硬方法,线下计算得出坐标公式,求公式比较难 import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
int number = 0;
for(int x=1; x<=n; x++){//横坐标x
for(int y=1; y<=n-x+1; y++){//纵坐标y
//线下计算得出坐标公式
number = (x*x + y*y -y -3*x)/2 + x*y + 1;
sb.append(number).append(" ");
}
sb.append("\r\n");
}
System.out.println(sb.toString());
br.close();
}
} 3.定义一个横向步长(x+y+1)和一个纵向步长(x),每一行计算后接着计算下一行import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
int base = 1;//每一行的初始值
for(int x=0; x<n; x++){//横坐标x,从0开始
base += x;//初始值累积
int number = base;//坐标值
for(int y=0; y<n-x; y++){//纵坐标y,从0开始
if(y>0){
number += x+y+1;//x+y+1为横坐标步长
}
sb.append(number).append(" ");
}
sb.append("\r\n");
}
System.out.println(sb.toString());
br.close();
}
} num = int(input())
#dic = {}
first = 1
for i in range(0,num):
li = []
first = first + i
li.append(str(first))
# print(first, end = " ")
val = first
for j in range(i+2, num+1):
val = val + j
li.append(str(val))
# print(val, end = " ")
# print(li)
print(" ".join(li))
#include <stdio.h>
int iLineBuff[101];
void genFirstLine(int *buf, int len)
{
int i;
int temp = 0;
for(i=1;i<=len;++i)
{
buf[i] = i * i - temp;
temp = buf[i];
}
}
void printTriangle(int *buff, int len)
{
int i, j;
for(i=1;i<=len;++i)
{
for(j=i;j<=len;++j)
{
printf("%d ", buff[j]--);
}
printf("\n");
}
}
int main()
{
int len;
while(EOF != scanf("%d", &len))
{
genFirstLine(iLineBuff, len);
printTriangle(iLineBuff, len);
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int main(){
/*
蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。
例如,当输入5时,应该输出的三角形为:
1 3 6 10 15
2 5 9 14
4 8 13
7 12
11
*/
/* N = 5
第一行,依次+2 +3 +4 +5
第二行,依次+3 +4 +5
第三行,依次+4 +5
第四行,+5
第五行,第四行最后一个减1
每排开头的第一个 等于 上一排第二个减一
*/
//可以创建一个二维数组,i为行数,每行第二个数为 第一个数+i+1,
int inputNum;
while(cin >> inputNum){
vector<vector<int>> vec;
vec.resize(inputNum);//初始化二维数组的行数
int i = 0 , n = inputNum;
int num = 1;
while(n > 0){
for(int j = i + 1; j <= inputNum; j++){//插入一行数组
vec[i].push_back(num);
num = num + j + 1;
}
i++;//控制数组插入行数
n--;
num = vec[i - 1][1] - 1;
}
for(int f = 0; f < inputNum; f++){
for(int t = 0; t < vec[f].size(); t++){
cout << vec[f][t] << " ";
}
cout << endl;
}
}
return 0;
} #include<iostream>
#include<vector>
using namespace std;
int main(){
int n;
while(cin>>n){
vector<vector<int>>snake(n,vector<int>(n,0));
//初始化第一行
for(int i=0;i<n;i++){
snake[0][i]=(i+1)*(i+2)/2;
}
//递推
for(int i=1;i<n;i++){
for(int j=0;j<n-i;j++){
snake[i][j]=snake[i-1][j+1]-1;
}
}
//输出
for(int i=0;i<n;i++){
for(int j=0;j<n-i;j++){
cout<<snake[i][j]<<" ";
}
cout<<endl;
}
}
return 0;
} import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while(in.hasNextInt()){
int n = in.nextInt(), a = 0, k = 1;
for(int i=1;i<=n;i++){
k += i-1;
a = k;
System.out.print(a+" ");
for(int j=1,k2=1+i;j<=n-i;j++){ // 注意:j<=n-i是使每行输出的个数递减,k2=1+i是每行的初始都会加1
a += (k2++);
System.out.print(a+" ");
}
System.out.println();
}
}
}
} import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int lines = 0;
while (scanner.hasNext()){
lines = scanner.nextInt();
printSnakeNum(lines);
}
}
public static void printSnakeNum(int lines){
int head = 1; // 从 1 开始
for (int i = 0; i < lines; i++){
head += i; // 首列元素之间相差 1 2 3 4.... 以此类推
System.out.print(head + " ");
int body = head;
for (int j = i + 2; j <= lines; j++){ // 第一行元素从2相差开始递增,第二行从3开始递增,每一行都比上一行的差值增1
body += j;
System.out.print(body + " ");
}
System.out.println();
}
}
} #include <stdio.h>
#include <stdlib.h>
#define N 100
int mat[N][N];
int main(void) {
int n, i, j, k, num;
while (scanf("%d", &n) != EOF) {
num = 1;
for (k = 0; k < n; ++k)
for (i = k, j = 0; i >= 0; --i, ++j)
mat[i][j] = num++;
for (i = 0; i < n; ++i) {
for (j = 0; j < n - i; ++j)
printf("%d ", *(*(mat + i) + j));
putchar('\n');
}
}
return 0;
} #include<iostream>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<vector>
using namespace std;
int main()
{
int n;
while(cin>>n) {
vector<vector<int>> matrix;
int id=1;
n=(1+n)*n/2; //输出的数字总数
while(id<=n) {
matrix.push_back(vector<int>(1,id++));
int div=matrix.size();
div-=1;
while(--div>=0) {
matrix[div].push_back(id++);
}
}
for(int i=0;i<matrix.size();++i) {
for(int x:matrix[i]) {
cout<<x<<" ";
}
cout<<endl;
}
}
return 0;
}
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line;
while((line = br.readLine()) != null){
int N = Integer.parseInt(line.trim());
int rowBeginNum = 1; // 第一行的第一个数
int stepRow = 1; // 每行第一个数的增幅
for(int i = 1; i <= N; i++){
int row = rowBeginNum; // 每行的第一个数
int n = N - i + 1; // 每行的数个数
StringBuilder sb = new StringBuilder();
int stepCol = i + 1; // 每列的初始增幅
int count = 0;
while(count++ < n){
sb.append(row + " ");
row += stepCol; // 更新本行的下一个数
stepCol ++; // 更新每列数的增幅
}
rowBeginNum += stepRow; // 更新下一行的第一个数
stepRow ++; // 更新每行第一个数的增幅
System.out.println(sb.toString().trim());
}
}
}
} //试了下竟然通过了!!!
#include <iostream>
using namespace std;
int main()
{
int n;
while(cin >> n)
{
int a[100][100] = {0};
int b[100] = {0};
int t1 = 1;
for(int i = 0; i < n; i++)
{
for(int j = i; j >= 0; j--)
{
a[j][b[j]] = t1;
b[j]++;
t1++;
}
}
for(int i = 0; i < n; i++)
{
for(int j = 0; j < b[i]; j++)
{
cout << a[i][j] << " ";
}
cout << endl;
}
}
} while True:
try:
n=int(input())
lst=[]
for i in range(n):
lst.append([ii for ii in range(int(i*(i+1)/2+1),int((i+1)*(i+2)/2+1))])
m=0
for m in range(n):
for i in range(m,n):
print(lst[i][-m-1],end=' ')
print('')
except:
break #include <stdio.h>
int main()
{
int n;
int func(int m,int n);
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;i++)
{
for(int j=0;i+j<n;j++)
{
printf("%d ",func(i,j));
}
printf("\n");
}
}
return 0;
}
int func(int m,int n)
{
if(m==0&&n==0)return 1;
else if(m!=0&&n==0)return func(m-1,n)+m;
else return func(m,n-1)+m+n+1;
} 递归居然要5ms。import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextInt()){
Main a = new Main();
int n = scanner.nextInt();
String result = "";
int start = 1;
for (int i = 0; i < n; i++){
result += String.valueOf(start);
int current = start;
int count = 2+i;
while (count <= n){
result += " " + String.valueOf(current+count);
current = current+count;
count += 1;
}
result += "\n";
start += 1+i;
}
System.out.print(result);
}
}
}
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int num = sc.nextInt();
if (num <= 0) {
continue;
}
int xstart = 1;
int xSet = 2;
int ySet = 1;
for (int x = 1; x <= num; x++) {
int set = xSet;
int temp = 0;
StringBuilder sb = new StringBuilder();
for (int y = 1; y <= num - x + 1; y++) {
if (y == 1) {
sb.append(xstart + " ");
temp = xstart;
continue;
}
temp = temp + set;
sb.append(temp + " ");
set++;
}
System.out.println(sb.toString().trim());
xstart += ySet;
ySet++;
xSet++;
}
}
}
}