题目输入为第一行数字: N,M,T
此后的N行,每行M个数字。
此后T行,输入r1,r2,c1,c2,S,A
题目要求:对给定的一个N行M列的数组,进行T次局部排序,输出局部排序后数组。
排序规则为,对r1行到r2行的第c1列到第c2列的数据 根据指定的第S列进行排序,如果A==0则从小到大排序,A==1则从大到小排序。
输出排序后完整的数组。
例子:
输入:
4 4 1
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
2 3 2 3 3 1
输出:
1 2 3 4
5 10 11 8
9 6 7 12
13 14 15 16
代码如下:通过率100%
#include <iostream>
#include <algorithm>
#include <vector>;
using namespace std;
bool compA1(vector<int> a, vector<int> b,int s) {
return a[s] > b[s];
}
int main() {
int N, M, T;
cin >> N >> M >> T;
vector<vector<int>> data(N);
for (int i = 0; i < N;i++) {
for (int j = 0; j < M; j++) {
int num;
cin >> num;
data[i].push_back(num);
}
}
while (T--) {
int r1, r2, c1, c2;
int s;
int A;
cin >> r1 >> r2 >> c1 >> c2 >> s >> A;
int len = r2 - r1 + 1;
int lenM = c2 - c1 + 1;
r1 -= 1;
c1 -= 1;
vector<vector<int>> newdata(len);
for (int i = 0; i < len;i++) {
for (int j = 0; j < lenM;j++) {
newdata[i].push_back(data[r1+i][c1+j]);
}
}
s = s - c1-1;
for (int i = 0; i < len;i++) {
for (int j = i; j < len; j++) {
if (A == 0) {
if (newdata[i][s] > newdata[j][s]) {
vector<int> tmp;
tmp = newdata[i];
newdata[i] = newdata[j];
newdata[j] = tmp;
}
}
else {
if (newdata[i][s] < newdata[j][s]) {
vector<int> tmp;
tmp = newdata[i];
newdata[i] = newdata[j];
newdata[j] = tmp;
}
}
}
}
for (int i = r1; i < r2;i++) {
for (int j = c1; j < c2;j++) {
data[i][j] = newdata[i - r1][j - c1];
}
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cout << data[i][j] << " ";
}
cout << endl;
}
return 0;
}