【解题记录】计蒜客-幻方矩阵

解题记录:

在这里插入图片描述

正确题解:

#include <iostream>
using namespace std;

const int N = 1e5 + 10;
int num[N], a[N], b[N];

int main()
{
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n * m; i++) cin >> num[i];
	int op;
	cin >> op;
	for (int i = 1; i <= op; i++)
	{
		int x, y, z;
		cin >> x >> y >> z;
		if (x == 0)
		{
			for (int j = (y - 1) * m + 1, k = 1; j <= y * m; j++, k++) a[k] = num[j];
			for (int j = (y - 1) * m + 1; j <= y * m; j++) num[j] = num[j + (z - y) * m];
			for (int j = (z - 1) * m + 1, k = 1; j <= z * m; j++, k++) num[j] = a[k];
		}

		else if (x == 1)
		{
			for (int j = y, k = 1; j <= (n - 1) * m + y + 1; j += m, k++) a[k] = num[j];
			for (int j = y; j <= (n - 1) * m + y + 1; j += m) num[j] = num[j + z - y];
			for (int j = z, k = 1; j <= (n - 1) * m + z + 1; j += m, k++) num[j] = a[k];
		}
	}
	for (int i = 1; i <= n * m; i++)
	{
		if (i % m != 0) cout << num[i] << " ";
		else cout << num[i] << endl;
	}

	return 0;
}

解题过程:

刚开始看到题目的时候,以为是在考察十字链表的用法,所以一直在构造十字链表。

之后尝试用数组的方法,但题目数据超过二维数组最大容量,在网上查到数组内存超限可以用vector来解决:

原因:vector不定长

vector 内部包括了一个用来记录数据的数组,当我们不断向 vector 中增加元素时,这个数组也有空间用完的时候,这时 vector 内部会申请一个更大的新的数组,并将原数组中的数据复制到新数组中,之后替换原数组,

#include <iostream>
#include <vector>
using namespace std;

int main()
{
	int n, m;
	cin >> n >> m;
	vector<vector<int>> matric(n, vector<int>(m));//matric有n个元素,每个元素是一个vector<int>类型的赋值为大小为m的元素
	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < m; j++) cin >> matric[i][j];
	}
	int op;
	cin >> op;
	for (int i = 0; i < op; i++)
	{
		int x, y, z;
		cin >> x >> y >> z;
		if (x == 0) swap(matric[y - 1], matric[z - 1]);
		else if (x == 1)
		{
			for (int j = 0; j < n; j++) swap(matric[j][y - 1], matric[j][z - 1]);
		}
	}

	for (int i = 0; i < n-1; i++)
	{
		for (int j = 0; j < m-1; j++) cout << matric[i][j] << " ";
		cout << matric[i][m-1]<<endl;
	}
	
	for (int j = 0; j < m-1; j++) cout << matric[n-1][j] << " ";
	cout << matric[n - 1][m - 1] << endl;;
	

	return 0;
}

二维vector数组用法:

//创建一维数组matirx,这个数组里有m个元素,元素是int型vector。
vector<vector<int>> matrix(m);
//除了定义数组类型及数组大小外,同时给数组中的元素赋值:将元素赋值为大小为n的int型vector。
vector<vector<int>> matrix(m, vector<int>(n));
//除了定义数组类型、数组大小、列的大小,同时给数组列中的元素(或者说,数组中的所有元素)赋值为-1。
vector<vector<int>> matrix(m, vector<int>(n, -1));


//比较具有普遍性的写法(注意:此种方法适用于每一行的列数相等的二维数组)
vector<vector<int>> matrix;//创建一维数组matirx,这个数组里的元素是int型vector。
int m = 3; //matrix有m行
int n = 10; //matrix有n列
int value = 1; //最终matrix成为二维数组后,其中每个元素的值为1(如果不需要进行初始化,此语句可以省略)
for (int i = 0; i < m; ++ i) {
    vector<int> tmp(n, value); //定义int型一维数组tmp,该数组有n个int型元素,且每个元素的初始值为value
    matrix.push_back(tmp); //将一维数组tmp(小容器)加入matrix(大容器)中,使之成为matrix的元素,令matrix成为二维数组
}

//如果需要每一行的列数不同(虽然一般很少这样做),也可以使用下面这种写法进行定义、初始化
vector<vector<int>> matrix;

vector<int> a(10, 1); //单独定义每个小容器的元素个数和元素初始值
vector<int> b(5, 2);
vector<int> c(10, 3);

matrix.push_back(a); //将每个小容器加入matrix(大容器)中
matrix.push_back(b);
matrix.push_back(c);

//使用vector的resize函数进行二维数组的定义(注意:此种方法适用于每一行的列数相等或不相等的二维数组,调整for循环内的resize函数的参数即可)
vector<vector<int>> matrix(m); //创建一维数组matirx,这个数组里有m个元素,元素是int型vector。不能省略m。
for (int i = 0; i < m; ++ i) {
	matrix[i].resize(10, 1); //使用vector的resize函数,对matrix(大容器)中的每个元素的大小进行更新(可以同时进行初始化)。此处表示:将matrix(大容器)中第i个int型vector的大小定义为10,且其元素均初始化为1。
    //如果不需要进行初始化,resize函数的第二个参数可以省略
}

但是

数组内存超限可以用vector来解决,但是不能解决超时问题。

所以只能换个思路使用数组,用一维数组解决问题手动计算数据在数组中位置。

const int N = 1e5+10;
int num[N];//一维数组不报错
int num[N][N];//二位数组栈溢出,报错
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值