1160 蛇形矩阵(维基oi)

本文介绍了一个数字游戏,通过特定算法生成n行n列的数字矩阵,并计算对角线数字之和。使用C++实现,涉及数组操作、循环遍历等技术。

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

题目描述 Description

小明玩一个数字游戏,取个n行n列数字矩阵(其中n为不超过100的奇数),数字的填补方法为:在矩阵中心从1开始以逆时针方向绕行,逐圈扩大,直到n行n列填满数字,请输出该n行n列正方形矩阵以及其的对角线数字之和.

n(即n行n列)

n+1行,n行为组成的矩阵,最后一行为对角线数字之和

3

5 4 3
6 1 2
7 8 9
25
有意思的题目,x,y代表4个方向:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
int x[4]={0,-1,0,1};
int y[4]={-1,0,1,0};
using namespace std;
int main()
{
	int n;
	int m[110][110];
	while (~scanf("%d",&n))
	{
		memset(m,0,sizeof(m));
		m[n][n]=n*n;
		int i=n,j=n;
		int s=n*n-1;
		int t=0;
		int ans=n*n;
		while (s)
		{
			if (i+x[t]==0 || j+y[t]==0 || j+y[t]>n || m[i+x[t]][j+y[t]]!=0)
				t=(t+1) % 4;
			i+=x[t];
			j+=y[t];
			m[i][j]=s;
			if (i==j || i==(n-j+1)) ans+=s;
			s--;
		}
		for (i=1;i<=n;i++)
		{
			for (j=1;j<n;j++)
				printf("%d ",m[i][j]);
			printf("%d\n",m[i][n]);
		}
		printf("%d\n",ans);
	}
	return 0;
}


 

 

 

### OI竞赛中的矩阵乘法运算实现及应用场景 #### 矩阵乘法定义与基本性质 在OI竞赛中,矩阵乘法是一种常见的操作。给定两个矩阵 \( A \) 和 \( B \),其中 \( A \) 是一个 \( m \times n \)矩阵,\( B \) 是一个 \( n \times p \)矩阵,则它们的乘积 \( C = AB \) 将是一个 \( m \times p \)矩阵。具体来说,对于任意位置 \( i, j \)矩阵 \( C \) 中的元素可以通过下述公式计算: \[ C_{ij} = \sum_{k=1}^{n} A_{ik}B_{kj} \] 这表示第 \( i \) 行和第 \( j \) 列的结果是由第一个矩阵的第 \( i \) 行与第二个矩阵的第 \( j \) 列对应相乘再求和得出。 #### Python代码实现矩阵乘法 下面展示了一个简单的Python函数来执行标准的矩阵乘法: ```python def matrix_multiply(A, B): rows_A = len(A) cols_A = len(A[0]) rows_B = len(B) cols_B = len(B[0]) if cols_A != rows_B: raise ValueError("无法相乘:A的列数必须等于B的行数") result = [[0 for _ in range(cols_B)] for __ in range(rows_A)] for i in range(rows_A): for j in range(cols_B): for k in range(cols_A): # 或者rows_B result[i][j] += A[i][k] * B[k][j] return result ``` 此方法的时间复杂度为O(),适用于较小规模的问题,在实际比赛中通常需要更高效的算法或利用特定结构简化问题[^1]。 #### 应用场景举例 - **快速幂取模**:通过构建转移方程并将其转换成矩阵形式,可以有效地解决斐波那契数列等问题。 - **图论最短路径**:Floyd-Warshall算法本质上就是一种基于邻接矩阵上的动态规划过程,它能够找出所有节点之间的最短距离。 - **几何变换**:旋转、缩放和平移等操作都可以表达为相应的变换矩阵,并通过对这些矩阵的操作完成复杂的图形处理任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值