解题记录:
正确题解:
#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];//二位数组栈溢出,报错