【模拟】I Got a Matrix!

本文介绍了一种求解矩阵边缘元素之和的算法。针对给定的n*m矩阵A,算法通过一次遍历,利用条件判断筛选出矩阵的第一行、最后一行、第一列和最后一列的元素,同时注意避免四角元素的重复计算,最终得出边缘元素的总和。

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

题目:

给定一个 n ∗ m 的矩阵 A,询问位于矩阵边缘的元素之和。所谓矩阵边缘的元素,就是第一行和
最后一行的元素以及第一列和最后一列的元素。


输入:

第一行包含两个整数 n 和 m。
之后 n 行每行包含 m 个整数 Ai,j。


输出:

共一行包含一个整数 ans,表示位于矩阵边缘的元素之和。


样例输入:

3 3
3 4 1
3 7 1
2 0 1

样例输出:

15

思路:

直接模拟,求外面那一圈。


注意:

如果你要用数组,记得去掉四个角重复的


代码:

#include<cstdio>
#include<iostream>
using namespace std;
int n,m,x,ans;
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++){
	scanf("%d",&x);  
	if (i==1||j==1||i==n||j==m)  //条件(是外面那一圈)
	ans=ans+x;//就把当前的数加进去
}
	printf("%d",ans);//输出
}
我有个用verilog编写的功能模块MAC4×4,其接口如下然后我这个模块的接口是这样 module MAC4x4( input rst_n, input clk, input ena, input last, input [31:0] in_a, input [31:0] in_b, output reg [31:0] out, output reg done ); 流程描述:in_a,in_b输入 一次4个int8,然后ena同时拉高就会开始,在ab输入完最后一个数据同时拉高last一个周期,拿结果就是会有4个周期的done 同时那四个周期可以拿out 也是4个int8数据小端存储(低存储顺序的数据在低位),这是具体代码module MAC4x4( input rst_n, input clk, input ena, input last, input [31:0] in_a, input [31:0] in_b, output reg [31:0] out, output reg done ); reg [7:0]PE_out[3:0][3:0]; reg [7:0]PE_right[2:0][2:0]; reg [7:0]PE_down[2:0][2:0]; reg [31:0] reg_b[2:0],reg_a[2:0]; reg [2:0]reg_last; reg last_flag; integer i,j; //打拍错开a和b矩阵排列 always @(posedge clk or negedge rst_n) begin if(~rst_n) begin for(i=0;i<=2;i=i+1) begin reg_a[i] <= 32’b0; reg_b[i] <= 32’b0; end end else if(ena) begin reg_a[0] <= in_a; reg_b[0] <= in_b; for(i=1;i<=2;i=i+1) begin reg_a[i] <= (reg_b[i-1] >> 8);//打拍后顺便右移,要的数据永远在低8位 reg_b[i] <= (reg_b[i-1] >> 8); end end end //第一行和第一列传递逻辑 always @(posedge clk or negedge rst_n) begin if(~rst_n) begin for(j=1;j<=2;j=j+1) begin PE_right[0][j] <= 7’b0; end for(i=1;i<=2;i=i+1) begin PE_down[i][0] <= 7’b0; end PE_right[0][0] <= 7’b0; end else if(ena) begin //00 PE_right[0][0] <= in_a[7:0]; PE_down[0][0] <= in_b[7:0]; // 第一行 for(j=1;j<=2;j=j+1) begin PE_right[0][j] <= PE_right[0][j-1];//从左往右直接传 end for(j=1;j<=3;j=j+1) begin PE_down[0][j] <= reg_b[j-1][7:0];//从上往下打拍 end //第一列 for(i=1;i<=2;i=i+1) begin PE_down[i][0] <= PE_down[i-1][0];//从上往下直接传 end for(i=1;i<=3;i=i+1) begin PE_right[i][0] <= reg_a[i-1][7:0];//从左往右打拍 end end end //第一行和第一列运算逻辑 always @(posedge clk or negedge rst_n) begin if(~rst_n) begin for(j=1;j<=2;j=j+1) begin PE_out[0][j] <= 7’b0; end for(i=1;i<=2;i=i+1) begin PE_out[i][0] <= 7’b0; end PE_out[0][0] <= 7’b0; end else if(ena) begin //00 PE_out[0][0] <= in_a[7:0] * in_b[7:0] + PE_out[0][0]; // 第一行 for(j=1;j<=3;j=j+1) begin PE_out[0][j] <= PE_right[0][j-1] * reg_b[j-1][7:0] + PE_out[0][j]; end //第一列 for(i=1;i<=3;i=i+1) begin PE_down[i][0] <= PE_down[i-1][0] * reg_a[i-1][7:0] + PE_down[i][0]; end end end //其他PE的传递、运算逻辑 always @(posedge clk or negedge rst_n) begin if(~rst_n) begin for(i=1;i<=2;i=i+1) for(j=1;j<=2;j=j+1) begin PE_right[i][j] <= 7’b0; PE_down[i][j] <= 7’b0; PE_out[i][j] <= 7’b0; end end else if(ena) begin for(i=1;i<=2;i=i+1) for(j=1;j<=2;j=j+1) begin PE_right[i][j] <= PE_right[i][j-1]; PE_down[i][j] <= PE_down[i-1][j]; PE_out[i][j] <= PE_out[i][j] + PE_right[i][j-1] * PE_down[i-1][j]; end end end //结束逻辑 always @(posedge clk or negedge rst_n) begin if(~rst_n) begin reg_last <= 3’b0; last_flag <= 1’b0; end else if(last == 1’b1) begin last_flag <= 1’b1; reg_last <= reg_last + 1’b1; end else if(last_flag && reg_last < 3’d6) reg_last <= reg_last + 1’b1; else if(last_flag >= 3’d6) begin last_flag <= 1’b0; reg_last <= 3’d0; end end //输出逻辑预生成 wire [31:0]out_wire[3:0]; genvar m,n; generate for (m=0; m<=3; m=m+1) begin for (n=0; n<=3; n=n+1) begin assign out_wire[m][n8+7:n8] = PE_out[0][n];//小端存储 end end endgenerate //输出逻辑 always @(posedge clk or negedge rst_n) begin if(~rst_n) begin done <= 1’b0; out <= 32’b0; end else if(reg_last >= 3’d3) begin done <= 1’b0; out <= out_wire[reg_last - 3]; end end endmodule请你给出一个testbench
03-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值